alineado 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 de gridExtra para astackrlos. El problema es que quiero que los bordes izquierdos de los gráficos se alineen, así como los bordes derechos, independientemente de las tags de los ejes. (El problema surge porque las tags de un gráfico son cortas mientras que el otro es largo).

La pregunta:
¿Cómo puedo hacer esto? No estoy casado con grid.arrange pero el ggplot2 es obligatorio.

Lo que he intentado:
Intenté jugar con anchuras y alturas, así como ncol y nrow para hacer una cuadrícula de 2 x 2 y colocar las imágenes en esquinas opuestas y luego jugar con los anchos, pero no pude obtener las imágenes en las 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) 

enter image description here

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 cantidad de plots) usando una versión modificada de rbind.gtable incluida en gridExtra

 gA <- ggplotGrob(A) gB <- ggplotGrob(B) grid::grid.newpage() grid::grid.draw(rbind(gA, gB)) 

Quería generalizar esto para cualquier cantidad de ttwigs. Aquí hay una solución paso a paso que utiliza el enfoque de Baptiste:

 plots <- list(A, B, C, D) grobs <- list() widths <- list() 

recolectar los anchos para cada grob de cada plot

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

ttwig

 do.call("grid.arrange", c(grobs, ncol = 1)) 

Usando el paquete cowplot :

 A <- ggplot(CO2, aes(x=Plant)) + geom_bar() +coord_flip() B <- ggplot(CO2, aes(x=Type)) + geom_bar() +coord_flip() library(cowplot) plot_grid(A, B, ncol=1, align="v") 

enter image description here

En http://rpubs.com/MarkusLoew/13295 es una solución realmente fácil disponible (último elemento) Aplicado a este problema:

 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.draw(rbind(ggplotGrob(A), ggplotGrob(B), size="first")) 

también puedes usar esto para ancho y alto:

 require(ggplot2);require(gridExtra) A <- ggplot(CO2, aes(x=Plant)) + geom_bar() +coord_flip() B <- ggplot(CO2, aes(x=Type)) + geom_bar() +coord_flip() C <- ggplot(CO2, aes(x=conc)) + geom_bar() +coord_flip() D <- ggplot(CO2, aes(x=uptake)) + geom_bar() +coord_flip() grid.draw(cbind( rbind(ggplotGrob(A), ggplotGrob(B), size="first"), rbind(ggplotGrob(C), ggplotGrob(D), size="first"), size='first')) 

Aquí hay otra posible solución que utiliza melt del paquete facet_wrap y facet_wrap :

 library(ggplot2) library(reshape2) dat = CO2[, c(1, 2)] dat$id = seq(nrow(dat)) mdat = melt(dat, id.vars="id") head(mdat) # id variable value # 1 1 Plant Qn1 # 2 2 Plant Qn1 # 3 3 Plant Qn1 # 4 4 Plant Qn1 # 5 5 Plant Qn1 # 6 6 Plant Qn1 plot_1 = ggplot(mdat, aes(x=value)) + geom_bar() + coord_flip() + facet_wrap(~ variable, nrow=2, scales="free", drop=TRUE) ggsave(plot=plot_1, filename="plot_1.png", height=4, width=6) 

enter image description here

El paquete de egg envuelve los objetos ggplot en una tabla estándar de 3x3 , lo que permite la alineación de los paneles de trazado entre ggplots arbitrarios, incluidos los facetados.

 library(egg) # devtools::install_github('baptiste/egg') library(ggplot2) p1 <- ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) + geom_point() p2 <- ggplot(mtcars, aes(mpg, wt, colour = factor(cyl))) + geom_point() + facet_wrap( ~ cyl, ncol=2, scales = "free") + guides(colour="none") + theme() ggarrange(p1, p2) 

enter image description here

En el mejor de los casos, esto es un truco:

 library(wq) layOut(list(A, 1, 2:16), list(B, 2:3, 1:16)) 

Sin embargo, se siente realmente mal.

Sé que esta es una publicación anterior, y que ya ha sido respondida, pero puedo sugerir combinar el enfoque de @ baptiste con purrr para que sea más agradable:

 library(purrr) list(A, B) %>% map(ggplotGrob) %>% do.call(gridExtra::gtable_rbind, .) %>% grid::grid.draw()