2013-10-09 10 views
8

Ho un set di dati da cui desidero tracciare piccoli multipli, in particolare in una matrice 2-by-2, in questo modo:Come aggiungere espressioni alle etichette in facet_wrap?

mydf <- data.frame(letter = factor(rep(c("A", "B", "C", "D"), each = 20)), x = rnorm(80), y = rnorm(80)) 
ggplot(mydf, aes(x = x, y = y)) + geom_smooth(method = "lm") + geom_point() + facet_wrap(~ letter, ncol = 2) 

Tuttavia, voglio ogni etichetta sfaccettatura per includere un'espressione, come

expression(paste("A or ", alpha)) 

posso fare questo accadere utilizzando facet_grid() via

f_names <- list('A' = expression(paste("A or ", alpha)), 'B' = expression(paste("B or ", beta)), 'C' = expression(paste("C or ", gamma)), 'D' = expression(paste("D or ", delta))) 
f_labeller <- function(variable, value){return(f_names[value])} 
ggplot(mydf, aes(x = x, y = y)) + geom_smooth(method = "lm") + geom_point() + facet_grid(~ letter, labeller = f_labeller) 

Ma poi ho perso la matrice 2-by-2. Come posso rinominare le faccette facet_wrap() con un'espressione? Oppure, come posso risolvere questo problema ricreando l'array 2-by-2 usando facet_grid(), ma solo sfaccettature di una singola variabile?

(Questa domanda costruisce fuori della nota tra parentesi a @ Baptiste risposta a this previous question.)

Grazie!

+0

Questo aiuto: http://stackoverflow.com/questions/10151123/how-to-specify-columns-in-facet-grid-or-how-to-change-labels-in-facet-wrap –

+0

@ Battista: Sì! Grazie, la funzione 'facet_wrap_labeller()' nel Q & A a cui hai collegato funziona alla grande. @Ricardo: Grazie per questo link - avevo trovato quella risposta, e mi ha spinto verso la domanda in origine. Grazie a tutti e due. – RTM

risposta

9

Per fare quello che ho chiesto, prima del carico questa funzione etichettatrice da @Roland prima apparizione here:

facet_wrap_labeller <- function(gg.plot,labels=NULL) { 
    #works with R 3.0.1 and ggplot2 0.9.3.1 
    require(gridExtra) 

    g <- ggplotGrob(gg.plot) 
    gg <- g$grobs  
    strips <- grep("strip_t", names(gg)) 

    for(ii in seq_along(labels)) { 
    modgrob <- getGrob(gg[[strips[ii]]], "strip.text", 
         grep=TRUE, global=TRUE) 
    gg[[strips[ii]]]$children[[modgrob$name]] <- editGrob(modgrob,label=labels[ii]) 
    } 

    g$grobs <- gg 
    class(g) = c("arrange", "ggplot",class(g)) 
    g 
} 

quindi salvare l'originale ggplot() oggetto:

myplot <- ggplot(mydf, aes(x = x, y = y)) + geom_smooth(method = "lm") + geom_point() + facet_wrap(~ letter, ncol = 2) 

Quindi chiamare facet_wrap_labeller() e mangimi l'espressione etichetta come argomento:

facet_wrap_labeller(myplot, labels = c(expression(paste("A or ", alpha)), expression(beta), expression(gamma), expression(delta))) 

Le espressioni ora dovrebbero apparire come etichette facet_wrap().

+0

Modo più semplice per usarlo, non necessario per passare un'espressione su ogni campo delle etichette, né le "etichette": facet_wrap_labeller (myplot, expression (incolla ("A o", alpha), beta, gamma, delta)) – Eduardo

+1

Per chiunque stia tentando questo più attualmente, è stata ora implementata una soluzione all'interno di ggplot. C'è un bell'esempio in fondo all'indice [ggplot] (http://docs.ggplot2.org/current/labellers.html) che mostra come farlo in modo molto pratico con facet_wrap. – Nova

Problemi correlati