instalar - Conservar la proporción de gráficos usando grid.arrange
ggplot2 r install (2)
Estoy tratando de organizar múltiples parcelas usando grid.arrange
. Hace el trabajo por el libro y cuando llama:
p1 <- ggplot(subset(mtcars, cyl = 4), aes(wt, mpg, colour = cyl)) + geom_point()
p2 <- ggplot(subset(mtcars, cyl = 8), aes(wt, mpg, colour = cyl)) + geom_point()
grid.arrange(p1, p2, ncol = 2)
Obtengo dos parcelas agradables, de tamaño simétrico:
Mis gráficos se refieren a diferentes parámetros pero comparten el mismo código de color para los grupos. Así que me gustaría eliminar la leyenda de todos menos uno y encontrar un buen lugar para ello.
Sin embargo, cuando intento:
p3 <- ggplot(subset(mtcars, cyl = 8), aes(wt, mpg, colour = cyl)) + geom_point() + guides(colour=FALSE)
grid.arrange(p3, p2, ncol = 2)
La trama sin la leyenda se hace (correctamente) más grande:
Me gustaría mantener el tamaño (como la longitud del eje x) para que permanezca igual en todos los gráficos.
Soy consciente de que podría usar faceting aquí, pero también necesitaré combinar varios gráficos que (creo) serán difíciles de implementar usando facetas.
¿Es posible hacerlo con grid.arrange
? ¿Alguna otra solución que pueda ayudar aquí?
Pruebe esto, que usa cbind.gtable
:
grid.draw(cbind(ggplotGrob(p3), ggplotGrob(p2), size="last"))
No es tan elegantemente simple como la solución de @Josh, pero puedes hacerlo con grid.arrange, que te permite conservar o especificar la relación de aspecto de las tramas, pero necesitas crear un tableGrob
para tu leyenda. Respondí una pregunta similar aquí, que es donde obtuve el práctico código para hacer un TableGrob de una leyenda de ggplot2:
## Make a tableGrob of your legend
tmp <- ggplot_gtable(ggplot_build(p2))
leg <- which(sapply(tmp$grobs, function(x) x$name) == "guide-box")
legend <- tmp$grobs[[leg]]
# Plot objects using widths and height and respect to fix aspect ratios
# We make a grid layout with 3 columns, one each for the plots and one for the legend
grid.newpage()
pushViewport( viewport( layout = grid.layout( 1 , 3 , widths = unit( c( 0.4 , 0.4 , 0.2 ) , "npc" ) ,heights = unit( c( 0.45 , 0.45 , 0.45 ) , "npc" ) , respect = matrix(rep(1,3),1) ) ) )
print( p1 + theme(legend.position="none") , vp = viewport( layout.pos.row = 1 , layout.pos.col = 1 ) )
print( p2 + theme(legend.position="none") , vp = viewport( layout.pos.row = 1, layout.pos.col = 2 ) )
upViewport(0)
vp3 <- viewport( width = unit(0.2,"npc") , x = 0.9 , y = 0.5)
pushViewport(vp3)
grid.draw( legend )
popViewport()