ggplot facet_wrap facet_grid examples color r ggplot2 facet-wrap

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



plotly facet_wrap (2)

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

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)

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

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"))

¿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.


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