2012-11-20 16 views
5

Sto provando a tracciare sottoinsiemi di dati utilizzando il diagramma di sfaccettatura. Si tratta di diagrammi di 2 colonne x4 righe. Prima colonna con valori compresi tra 120 e 150 e seconda colonna con valori compresi tra 180 e 250 e le variabili vengono assegnate come Minore o Maggiore nel file di dati. Sto riscontrando problemi con l'aggiunta di etichette specifiche ('120 < = simbolo greco (alpha) < = 150', '180 < = simbolo greco (alpha) < = 250) alle variabili di colonna ("Lesser", "Greater") . Ho provato a fare come:Etichettatura facet con R

require(graphics) 
library(ggplot2) 
hp <- ggplot2(data) + .... 
xlow <- paste("120 <", expression(alpha), " < 150") 
xhi <- paste("180 <", expression(alpha), " < 250") 
mf_labeller <- function(var, value){ 
    value <- as.character(value) 
    if (var=="regime") { 
    value[value=="Lesser"] <- xlow 
    value[value=="Greater"] <- xhi 
} 
    return(value) 
} 
(hp %+% data) + facet_grid(param~regime, scales="free", labeller=mf_labeller) 

ottengo "Errore di valore == 'Grande': il confronto non sono ammessi per le espressioni". Ho provato a forzare anche i dati. Se faccio l'etichettatura in alcun modo:

data2 <- transform(data, regime = factor(regime, levels=c("Lesser", "Greater"), labels=c(expression(paste("120 <", alpha," < 150")), expression("180 < alpha < 250")))) 

ottengo l'intera espressione alla lettera, e non le trame desiderati. Potrei mancare qualcosa. Qualsiasi aiuto è molto apprezzato !! Grazie in anticipo ..

I brani del mio campione è:

regime,param,line,XX,Var,sner 
Lesser,Rise,VII,AA,4.968624,0.1275248 
Lesser,Rise,VII,BB,3.719405,0.08470305 
Lesser,Rise,VII,CC,7.608773,0.177848 
Lesser,Rise,VII,DD,9.874395,0.1367159 
Lesser,Text,VII,AA,4.968624,0.1275248 
Lesser,Text,VII,BB,3.719405,0.08470305 
Lesser,Text,VII,CC,7.608773,0.177848 
Lesser,Text,VII,DD,9.874395,0.1367159 
Lesser,Chant,VII,AA,0.1771826,0.186758 
Lesser,Chant,VII,BB,0.3611497,0.5484656 
Lesser,Chant,VII,CC,0.7719002,0.8864444 
Lesser,Chant,VIII,DD,1.829022,0.2639881 
Greater,Rise,VII,AA,4.968624,0.1275248 
Greater,Rise,VII,BB,3.719405,0.08470305 
Greater,Rise,VII,CC,7.608773,0.177848 
Greater,Rise,VII,DD,9.874395,0.1367159 
Greater,Text,VII,AA,4.968624,0.1275248 
Greater,Text,VII,BB,3.719405,0.08470305 
Greater,Text,VII,CC,7.608773,0.177848 
Greater,Text,VII,DD,9.874395,0.1367159 
Greater,Chant,VII,AA,0.1771826,0.186758 
Greater,Chant,VII,BB,0.3611497,0.5484656 
Greater,Chant,VII,CC,0.7719002,0.8864444 
Greater,Chant,VIII,DD,1.829022,0.2639881 

e il codice che ho usato: ho scritto in precedenza espressione nel modo sbagliato qui nel post, ma ho usato il corretto nel codice .

x <- read.table("sample.csv", header=T, sep=',') 
require(graphics) 
library(ggplot2) 
ppi <- 300 
png("figure.png", width=6*ppi, height=6*ppi, res=ppi) 
hp <- ggplot(data=x,aes(x=XX, y=Var, colour=line, group = line)) + geom_errorbar(aes(ymin=Var-sner, ymax=Var+sner, colour=line), width=.3) + geom_line(aes(ymax=Var+sner), size=0.7) + geom_point(aes(ymax=Var+sner), shape=21, size=2,fill="white") + theme_bw() + theme(axis.text.x = element_text(angle=90,vjust=0.25), panel.grid.minor=element_blank(), panel.grid.major=element_blank(), panel.background =element_blank(), legend.position="none") + scale_colour_hue(l=40) 
xlow <- expression(paste("120 <",alpha," < 150")) 
xhi <- expression(paste("180 <", alpha," < 250")) 
.. earlier code block as alternative here... 
data2 <- transform(x, regime = factor(regime, levels=c("Lesser", "Greater"), labels=c(bquote(120<.(alpha)~phantom()<150), bquote(180<.(alpha)~phantom()<250)) 
(hp %+% data2) + facet_grid(param~regime, scales="free", labeller=label_bquote) 

ho provato come in precedenza con mf_labeller troppo .. Grazie in anticipo

risposta

0

Non abbiamo i dati di prova (né abbiamo il codice che si sta utilizzando), ma prima esperienza con reticolo la stampa mi ha insegnato che potrebbe essere necessario sia bquote sia una combinazione di sapply e as.expression. Prova:

..., labels=c(bquote(120<.(alpha)~phantom()<150), bquote(180<.(alpha)~phantom()<250)) 

Nella prima sezione di codice non avrei pensato che si dovrebbe utilizzare expression all'interno paste ma piuttosto costruire le etichette prima e poi la costruzione di un vettore di espressione.

Se si è disperati, è possibile creare prima la trama e quindi forzare le etichette ad essere qualcosa di diverso. How can I use grid to edit a ggplot2 object to add math expressions to facet labels?

+0

Grazie per la risposta. Ma anche questo non sembra funzionare nel mio caso. Anche se il codice viene eseguito ma non viene generato alcun grafico di output. – user1818565

+0

Sigh. Ovviamente non viene generato alcun output. Non hai fornito alcun codice o dati. Noterai che spero che Brian Diggs abbia usato la strategia phantom() per far funzionare il diagramma. –

0

Non ho una risposta reale, ma lo sto mettendo nella speranza che sia utile. La mia soluzione genera un errore con due segni in meno, ma funziona con uno, il che mi sembra un comportamento bacato. (Edit, vedere Brian Diggs commento qui sotto o rispondere presumibilmente/spera sopra per perché questo non è bacato.)

dati del campione che funziona, nota sto sostituendo un plus per una meno-che in twolabs:

twolabs <- c("120<alpha+150","150<alpha+250") 
df<- data.frame(x=rnorm(mean=4,40), 
    y=rnorm(mean=4,40), 
    labs=sample(twolabs,40,replace=T)) 

Questa trama funziona magnificamente.

ggplot(df,aes(x=x,y=y))+geom_point()+facet_grid(.~labs,labeller=label_parsed) 

Tuttavia, i dati con meno di due segni genera un errore:

twolabs <- c("120<alpha<150","150<alpha<250") 
df2<- data.frame(x=rnorm(mean=4,40), 
    y=rnorm(mean=4,40), 
    labs=sample(twolabs,40,replace=T)) 

> ggplot(df2,aes(x=x,y=y))+geom_point()+facet_grid(.~labs,labeller=label_parsed) 
Error in parse(text = x) : <text>:1:10: unexpected '<' 
1: 120<alpha< 

By utilizzando label_parsed, penso che noi chiamiamo in ultima analisi, chiamare gridDevices :: plotmath, per quello che vale. Qualcuno può prenderlo ulteriormente?

+1

'<' è un operatore binario e ognuno ha bisogno del proprio lato sinistro e destro ('a

+0

Questo ha perfettamente senso. Grazie! – MattBagg

5

La forma che si desidera per l'espressione plotmath è

expression(120 <= alpha~phantom() <= 150) 
expression(180 <= alpha~phantom() <= 250) 

che si può ottenere in questo modo o indirettamente da

parse(text="120 <= alpha~phantom() <= 150") 
parse(text="180 <= alpha~phantom() <= 250") 

Il modo più semplice è quello di impostare i livelli del fattore di quelle corde e utilizzare la funzione label_parsed.

derisione questo con i dati mtcars, dal momento che non ha fornito un'esempio riproducibile:

dat <- mtcars 
dat$regime <- factor(dat$am) 
levels(dat$regime) <- list("120 <= alpha~phantom() <= 150" = "0", 
          "180 <= alpha~phantom() <= 250" = "1") 

ggplot(aes(x=wt, y=mpg), data=dat) + 
    geom_point() + 
    facet_grid(cyl ~ regime, labeller=label_parsed) 

enter image description here

Se davvero si vuole utilizzare il proprio etichettatrice, e non si vuole cambia i livelli dei fattori dei tuoi dati sottostanti, puoi farlo anche tu. Cominciamo con i dati finti con e livelli di "minore" "Grande":

dat <- mtcars 
dat$regime <- factor(dat$am, levels=c(0,1), labels=c("Lesser", "Greater")) 

Poi sarebbe la funzione etichettatrice e il codice ggplot:

mf_labeller <- function(var, value){ 
    value <- as.character(value) 
    if (var=="regime") { 
    value[value=="Lesser"] <- "120 <= alpha~phantom() <= 150" 
    value[value=="Greater"] <- "180 <= alpha~phantom() <= 250" 
    value <- lapply(value, function(x) parse(text=x)) 
    } 
    return(value) 
} 

ggplot(aes(x=wt, y=mpg), data=dat) + 
    geom_point() + 
    facet_grid(cyl ~ regime, labeller=mf_labeller) 

Il grafico sembra lo stesso.

+0

Grazie mille. Che funzioni. :) – user1818565