Alinear a la izquierda dos bordes del gráfico (ggplot)

Resuelto Tyler Rinker asked hace 54 años • 9 respuestas

Estoy usando ggplot y tengo dos gráficos que quiero mostrar uno encima del otro. Utilicé grid.arrangegridExtra 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)

ingrese la descripción de la imagen aquí

Tyler Rinker avatar Jan 01 '70 08:01 Tyler Rinker
Aceptado

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.gtableincluida engridExtra

gA <- ggplotGrob(A)
gB <- ggplotGrob(B)
grid::grid.newpage()
grid::grid.draw(rbind(gA, gB))
baptiste avatar Nov 08 '2012 19:11 baptiste

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))
slizb avatar Oct 11 '2013 14:10 slizb