2011-07-19 20 views
10

¿Es posible modificar el formato de un gráfico de facetas individual? Por ejemplo, usando el código de ejemplo siguiente, ¿se puede cambiar el color del título o el fondo de la gráfica cyl = 8?¿Cómo cambiar el formato de un panel facet_wrap individual?

library(ggplot2) 
ggplot(mtcars, aes(x=gear)) + 
    geom_bar(aes(y=gear), stat="identity", position="dodge") + 
    facet_wrap(~cyl) 
+0

Esta pregunta es similar y podría proporcionar inspiración: http://stackoverflow.com/q/3167444/602276 – Andrie

Respuesta

17

Puede modificar las grobs ggplot2, por ejemplo:

library("ggplot2") 
d <- ggplot(mtcars, aes(x=gear)) + 
     geom_bar(aes(y=gear), stat="identity", position="dodge") + 
     facet_wrap(~cyl) 

grob <- ggplotGrob(d) 
strip_bg <- grid.ls(getGrob(grob, "strip.background.rect", 
          grep=TRUE, global=TRUE))$name 
panel_bg <- grid.ls(getGrob(grob, "panel.background.rect", 
          grep=TRUE, global=TRUE))$name 
strip_text <- grid.ls(getGrob(grob, "strip.text.x", 
           grep=TRUE, global=TRUE))$name 
grob <- geditGrob(grob, strip_bg[2], gp=gpar(fill="gray60")) 
grob <- geditGrob(grob, panel_bg[2], gp=gpar(fill="darkolivegreen2")) 
grob <- geditGrob(grob, strip_text[2], gp=gpar(col="white")) 
grid.draw(grob) 

geditGrob example

Actualización: Esto debería funcionar con ggplot2 0 .9.3

grob <- ggplotGrob(d) 

elem <- grob$grobs$panel2 
panel_bg <- grid.ls(getGrob(elem, "panel.background.rect", grep=TRUE))$name 
grob$grobs$panel2 <- editGrob(elem, panel_bg, gp=gpar(fill="darkolivegreen"), grep=TRUE) 

elem <- grob$grobs$strip_t.1 
strip_bg <- grid.ls(getGrob(elem, "strip.background.rect", grep=TRUE))$name 
grob$grobs$strip_t.1 <- editGrob(elem, strip_bg, gp=gpar(fill="gray60"), grep=TRUE) 

elem <- grob$grobs$strip_t.1 
strip_text <- grid.ls(getGrob(elem, "strip.text.x.text", grep=TRUE))$name 
grob$grobs$strip_t.1 <- editGrob(elem, strip_text, gp=gpar(col="white"), grep=TRUE) 

grid.draw(grob) 
+0

Esto funciona, ¡gracias! – user338714

+0

+1 pero esto ya no funciona ('grid.ls'). ¿Tienes alguna idea de cómo actualizar? –

+1

@ SimonO101 ver la respuesta actualizada ... – rcs

3

Esto podría ayudarle a obtener un poco más cerca de lo que quiere:

mtcars2 = subset(mtcars, cyl != 8) 
    subs = subset(mtcars, cyl == 8) 

require(ggplot2) 
ggplot(mtcars2, aes(x=gear)) + 
    geom_bar(aes(y=gear, fill = 'black'), stat="identity", position="dodge") + 
    geom_bar(data = subs, aes(x = gear), fill = 'blue', binwidth = 1) + 
    facet_wrap(~cyl) 
8

Sé que esto es una vieja pregunta por lo que el cartel original es probablemente mucho desaparecido, pero aún así creo que vale la pena responder como un recurso para futuros investigadores. La respuesta aceptada de rcs funciona, pero me pareció bastante inestable y hacky. Al final, decidí que era necesario un enfoque más modesto pero más estable. Con este método sólo se puede cambiar el fondo, sino que es suficiente para mis propósitos y potencia por los demás, mi enfoque es utilizar geom_rect recolour el fondo, así:

highlights <- data.frame(cyl=c(8)) 

ggplot() + 
    geom_rect(data=highlights,aes(xmin=-Inf, xmax=Inf, ymin=-Inf, ymax=Inf), fill='red', alpha=0.2) + 
    geom_bar(data = mtcars, aes(x=gear), position="dodge", fill = 'black') + 
    facet_wrap(~cyl) 

Example plot

Cuestiones relacionadas