ggplot2: facet_wrap color de tira basado en variable en conjunto de datos

¿Hay alguna manera de llenar las franjas de facetas creadas con facet_wrap en función de una variable suministrada con el dataframe?

Ejemplo de datos:

MYdata <- data.frame(fruit = rep(c("apple", "orange", "plum", "banana", "pear", "grape")), farm = rep(c(0,1,3,6,9,12), each=6), weight = rnorm(36, 10000, 2500), size=rep(c("small", "large")))

Parcela de ejemplo:

p1 = ggplot(data = MYdata, aes(x = farm, y = weight)) + geom_jitter(position = position_jitter(width = 0.3), aes(color = factor(farm)), size = 2.5, alpha = 1) + facet_wrap(~fruit)

Sé cómo cambiar el color de fondo de las tiras (por ejemplo, a naranja):

p1 + theme(strip.background = element_rect(fill="orange"))

facet_wrap y color anaranjado de la tira

¿Hay alguna manera de transmitir los valores en el size variable en MYdata al parámetro fill element_rect ?

Básicamente, en lugar de 1 color para todas las tiras, me gustaría que el color de fondo de las frutas pequeñas (manzana, ciruela, pera) sea verde y que el color de fondo de las frutas grandes (naranja, plátano, uva) sea rojo.

Con un poco de trabajo, puede combinar su ttwig con un tablaje ficticio que tenga los grobs correctos,

enter image description here

 d <- data.frame(fruit = rep(c("apple", "orange", "plum", "banana", "pear", "grape")), farm = rep(c(0,1,3,6,9,12), each=6), weight = rnorm(36, 10000, 2500), size=rep(c("small", "large"))) p1 = ggplot(data = d, aes(x = farm, y = weight)) + geom_jitter(position = position_jitter(width = 0.3), aes(color = factor(farm)), size = 2.5, alpha = 1) + facet_wrap(~fruit) dummy <- ggplot(data = d, aes(x = farm, y = weight))+ facet_wrap(~fruit) + geom_rect(aes(fill=size), xmin=-Inf, xmax=Inf, ymin=-Inf, ymax=Inf) + theme_minimal() library(gtable) g1 <- ggplotGrob(p1) g2 <- ggplotGrob(dummy) gtable_select <- function (x, ...) { matches <- c(...) x$layout <- x$layout[matches, , drop = FALSE] x$grobs <- x$grobs[matches] x } panels <- grepl(pattern="panel", g2$layout$name) strips <- grepl(pattern="strip_t", g2$layout$name) g2$layout$t[panels] <- g2$layout$t[panels] - 1 g2$layout$b[panels] <- g2$layout$b[panels] - 1 new_strips <- gtable_select(g2, panels | strips) grid.newpage() grid.draw(new_strips) gtable_stack <- function(g1, g2){ g1$grobs <- c(g1$grobs, g2$grobs) g1$layout <- transform(g1$layout, z= z-max(z), name="g2") g1$layout <- rbind(g1$layout, g2$layout) g1 } ## ideally you'd remove the old strips, for now they're just covered new_plot <- gtable_stack(g1, new_strips) grid.newpage() grid.draw(new_plot) 

Me encantaría saber cómo hacer eso, es una gran idea. Una idea es generar cada gráfico de forma independiente con un color diferente a como lo hace y luego usar algo como multiplot o viewports para mostrarlos uno al lado del otro: requerirá un poco más de trabajo.

si quieres extraer la leyenda, que necesitarás para este enfoque, aquí hay un código de Hadley que encontré hace un tiempo

 g_legend<-function(a.gplot){ tmp <- ggplot_gtable(ggplot_build(a.gplot)) leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box") legend <- tmp$grobs[[leg]] return(legend)} 

ver cómo se extrae del gráfico p, y luego lo saqué de la leyenda de la gráfica <- g_legend (p) lwidth <- sum (legend $ width) # si desea definir la ventana basada en este p <- p + tema (legend.position = "none")

entonces eventualmente lo dibujas

 grid.newpage() vp <- viewport(width = 1, height = 1) #print(p, vp = vp) submain <- viewport(width = 0.9, height = 0.9, x = 0.5, y = 1,just=c("center","top")) print(p, vp = submain) sublegend <- viewport(width = 0.5, height = 0.2, x = 0.5, y = 0.0,just=c("center","bottom")) print(arrangeGrob(legend), vp = sublegend) 

Buena suerte

    Intereting Posts