Alinear a la izquierda dos bordes del gráfico (ggplot)
Estoy usando ggplot y tengo dos gráficos que quiero mostrar uno encima del otro. Utilicé grid.arrange
gridExtra para apilarlos. El problema es que quiero que los bordes izquierdos de los gráficos se alineen tan bien como los bordes derechos, independientemente de las etiquetas de los ejes. (el problema surge porque las etiquetas de un gráfico son cortas mientras que las del otro son largas).
La pregunta:
¿Cómo puedo hacer esto? No estoy casado con grid.arrange pero ggplot2 es imprescindible.
Lo que intenté:
intenté jugar con anchos y alturas, así como con ncol y nrow para hacer una cuadrícula de 2 x 2 y colocar los elementos visuales en esquinas opuestas y luego jugar con los anchos, pero no pude colocar los elementos visuales en esquinas opuestas. .
require(ggplot2);require(gridExtra)
A <- ggplot(CO2, aes(x=Plant)) + geom_bar() +coord_flip()
B <- ggplot(CO2, aes(x=Type)) + geom_bar() +coord_flip()
grid.arrange(A, B, ncol=1)
Prueba esto,
gA <- ggplotGrob(A)
gB <- ggplotGrob(B)
maxWidth = grid::unit.pmax(gA$widths[2:5], gB$widths[2:5])
gA$widths[2:5] <- as.list(maxWidth)
gB$widths[2:5] <- as.list(maxWidth)
grid.arrange(gA, gB, ncol=1)
Editar
Aquí hay una solución más general (funciona con cualquier número de gráficos) usando una versión modificada de rbind.gtable
incluida engridExtra
gA <- ggplotGrob(A)
gB <- ggplotGrob(B)
grid::grid.newpage()
grid::grid.draw(rbind(gA, gB))
Quería generalizar esto para cualquier número de parcelas. Aquí hay una solución paso a paso utilizando el enfoque de Baptiste:
plots <- list(A, B, C, D)
grobs <- list()
widths <- list()
recopilar los anchos para cada grob de cada parcela
for (i in 1:length(plots)){
grobs[[i]] <- ggplotGrob(plots[[i]])
widths[[i]] <- grobs[[i]]$widths[2:5]
}
use do.call para obtener el ancho máximo
maxwidth <- do.call(grid::unit.pmax, widths)
asignar el ancho máximo a cada grob
for (i in 1:length(grobs)){
grobs[[i]]$widths[2:5] <- as.list(maxwidth)
}
trama
do.call("grid.arrange", c(grobs, ncol = 1))