esquerda alinhar duas arestas do gráfico (ggplot)

Estou usando o ggplot e tenho dois charts que quero exibir em cima uns dos outros. Eu usei grid.arrange de gridExtra para empilhá-los. O problema é que quero que as bordas esquerdas dos charts se alinhem, assim como as bordas direitas, independentemente dos labels dos eixos. (o problema surge porque os labels de um gráfico são curtos enquanto o outro é longo).

A questão:
Como posso fazer isso? Eu não sou casado com grid.arrange mas o ggplot2 é uma obrigação.

O que eu tentei:
Eu tentei jogar com larguras e alturas, bem como ncol e nrow para fazer uma grade de 2 x 2 e colocar o visual em cantos opostos e, em seguida, jogar com as larguras, mas eu não conseguia o visual em cantos opostos.

 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) 

insira a descrição da imagem aqui

Tente isso

  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

Aqui está uma solução mais geral (funciona com qualquer número de charts) usando uma versão modificada do rbind.gtable incluída no gridExtra

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

Eu queria generalizar isso para qualquer número de charts. Aqui está uma solução passo-a-passo usando a abordagem de Baptiste:

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

coletar as larguras 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 obter a largura máxima

 maxwidth < - do.call(grid::unit.pmax, widths) 

Atribuir a largura máxima para cada grob

 for (i in 1:length(grobs)){ grobs[[i]]$widths[2:5] < - as.list(maxwidth) } 

enredo

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

Usando o pacote 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") 

insira a descrição da imagem aqui

Em http://rpubs.com/MarkusLoew/13295 é uma solução realmente fácil disponível (último item) 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")) 

Você também pode usar isso para largura e altura:

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

Aqui está outra solução possível usando o melt do pacote facet_wrap e 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) 

insira a descrição da imagem aqui

O pacote de egg envolve objects ggplot em uma tabela padronizada de 3x3 , permitindo o alinhamento de painéis de plotagem entre charts ggg6 arbitrários, incluindo os 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) 

insira a descrição da imagem aqui

Na melhor das hipóteses, isso é um hack:

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

Parece mesmo errado.

Eu sei que este é um post antigo, e que já foi respondido, mas sugiro combinar a abordagem do purrr com o purrr para torná-lo mais bonito:

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