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