2012-03-23 14 views
23

Estoy usando el conjunto de datos "consejos" en ggplot2. Si lo hago¿Cambiar condicionalmente el fondo del panel con facet_grid?

sp = ggplot(tips,aes(x=total_bill, y = tip/total_bill)) + 
     geom_point(shape=1) + 
     facet_grid(sex ~ day) 

La trama sale bien. Pero ahora quiero cambiar el fondo del panel para las parcelas debajo de "Vie". ¿Hay alguna forma de hacer esto?

Mejor aún, ¿puedo cambiar los colores de manera condicional pasando los parámetros? Por ejemplo, si más de 3 puntos están por debajo de 0.1, entonces cambie el fondo del panel (para ese panel) a un cierto color, mientras que los demás siguen siendo el gris claro predeterminado.

Respuesta

50

La regla general para hacer nada en ggplot2 es,

  1. Crear una trama de datos que codifica la información que desea trazar
  2. Pass que la trama de datos a un geom

Esto se hace un poco más complicado en este caso debido al aspecto particular de la trama que desea modificar. Los poderes que se diseñan ggplot2 de una manera que separa elementos de datos de la gráfica (es decir, geom) de elementos que no son de datos (es decir, temas), y sucede que el fondo de la gráfica cae dentro de la categoría "no datos".

siempre existe la opción de modificar el objeto de la cuadrícula subyacente manually pero esto es tedioso y los detalles pueden cambiar con diferentes versiones de ggplot2. En cambio, emplearemos el "truco" al que se refiere Hadley en la pregunta this.

#Create a data frame with the faceting variables 
# and some dummy data (that will be overwritten) 
tp <- unique(tips[,c('sex','day')]) 
tp$total_bill <- tp$tip <- 1 

#Just Fri 
ggplot(tips,aes(x=total_bill, y = tip/total_bill)) + 
     geom_rect(data = subset(tp,day == 'Fri'),aes(fill = day),xmin = -Inf,xmax = Inf, 
      ymin = -Inf,ymax = Inf,alpha = 0.3) + 
     geom_point(shape=1) + 
     facet_grid(sex ~ day) 

enter image description here

#Each panel 
ggplot(tips,aes(x=total_bill, y = tip/total_bill)) + 
     geom_rect(data = tp,aes(fill = day),xmin = -Inf,xmax = Inf, 
      ymin = -Inf,ymax = Inf,alpha = 0.3) + 
     geom_point(shape=1) + 
     facet_grid(sex ~ day) 

enter image description here

+0

Gracias mucho para la ayuda. Definitivamente útil. – broccoli

+3

Tenga en cuenta que establecer panel.background y el geom_rect anterior se comportan de manera diferente cuando se encuentra detrás de geom_raster porque se puede realizar una optimización cuando no hay "nada" detrás del ráster. Cuando se guarda como un pdf, la versión geom_rect es un archivo significativamente más grande y prácticamente imposible de abrir con la mayoría de los lectores de PDF. – momeara

+0

¿Es posible hacer esto con una función y escala continuas? – UnivStudent

1

que no puedo comentar todavía .. asi que aquí hay una respuesta adicional a Joran su respuesta.

Si tiene problemas con la configuración de transparencia, como establecer alfa = 0.2 pero sin notar ninguna diferencia, puede ser debido a los datos que le da a ggplot.

"Gracias por aclarar su pregunta. Esto me resultaba desconcertante, así que fui a Google y terminé aprendiendo algo nuevo (después de trabajar con algunos ejemplos extraños). Aparentemente, lo que está haciendo es dibujar muchos rectángulos en uno encima del otro, anulando efectivamente la semi-transparencia que desee. por lo tanto, la única manera de superar esto son a codificar el rectángulo coordina en un df separada"

esta respuesta viene de geom_rect and alpha - does this work with hard coded values?

Cuestiones relacionadas