aligner à gauche deux arêtes du graphe (ggplot)

J’utilise ggplot et j’ai deux graphiques que je veux afficher les uns sur les autres. J’ai utilisé grid.arrange de gridExtra pour les emstackr. Le problème est que je veux que les bords gauche des graphiques soient alignés, ainsi que les bords droits, indépendamment des étiquettes des axes. (le problème se pose parce que les étiquettes d’un graphique sont courtes et que l’autre est long).

La question:
Comment puis-je faire ceci? Je ne suis pas marié à grid.arrange mais le ggplot2 est un must.

Ce que j’ai essayé:
J’ai essayé de jouer avec des largeurs et des hauteurs, ainsi que ncol et nrow pour faire une grid de 2 x 2 et placer les visuels dans des coins opposés, puis jouer avec les largeurs mais je ne pouvais pas obtenir les visuels opposés.

 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) 

entrer la description de l'image ici

Essaye ça,

  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) 

modifier

Voici une solution plus générale (fonctionne avec un nombre quelconque de tracés) en utilisant une version modifiée de rbind.gtable incluse dans gridExtra

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

Je voulais généraliser ceci pour n’importe quel nombre de plots. Voici une solution étape par étape utilisant l’approche de Baptiste:

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

recueillir les largeurs de chaque case de chaque plot

 for (i in 1:length(plots)){ grobs[[i]] <- ggplotGrob(plots[[i]]) widths[[i]] <- grobs[[i]]$widths[2:5] } 

utiliser do.call pour obtenir la largeur maximale

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

atsortingbuer la largeur maximale à chaque grob

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

terrain

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

En utilisant le paquet 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") 

entrer la description de l'image ici

Sur http://rpubs.com/MarkusLoew/13295 est une solution vraiment simple disponible (dernier élément) Appliquée à ce problème:

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

vous pouvez également l'utiliser pour la largeur et la hauteur:

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

Voici une autre solution possible utilisant melt du package reshape2, et 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) 

entrer la description de l'image ici

Le paquet d’ egg enveloppe les objects ggplot dans une gtable 3x3 normalisée, permettant l’alignement des panneaux de tracé entre des ggplots arbitraires, y compris ceux à facettes.

 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) 

entrer la description de l'image ici

Au mieux c’est un hack:

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

Cela semble vraiment mal si.

Je sais que c’est un ancien message, et qu’il a déjà été répondu, mais puis-je suggérer de combiner l’approche de @ baptiste avec purrr pour le rendre plus beau:

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