J'ai trois parcelles et j'essaie de les combiner avec grid.arrange. La dernière parcelle doit avoir une hauteur inférieure à celle des deux premières parcelles et toutes les parcelles doivent avoir la même largeur.
Un exemple de travail:
p1 <- qplot(mpg, wt, data=mtcars)
p2 <- p1
p3 <- p1 + theme(axis.text.y=element_blank(), axis.title.y=element_blank())
grid.arrange(arrangeGrob(p1,p2, ncol=1, nrow=2),
arrangeGrob(p3, ncol=1, nrow=1), heights=c(4,1))
Ici, la dernière parcelle a une largeur plus grande que les deux premières. Dans mes données réelles, même si je conserve le texte et le titre sur l'axe des ordonnées, la largeur du troisième tracé est toujours différente.
J'ai essayé d'ajouter "largeurs":
grid.arrange(arrangeGrob(p1,p2, ncol=1, nrow=2),
arrangeGrob(p3, ncol=1, nrow=1), heights=c(4,1), widths=c(2,1))
Mais cela se transforme en un complot de deux colonnes ...
J'ai aussi essayé un autre code:
p1 <- ggplotGrob(p1)
p2 <- ggplotGrob(p2)
p3 <- ggplotGrob(p3)
#
stripT <- subset(p2$layout, grepl("spacer", p2$layout$name))
p3 <- p3[-stripT$t, ]
grid.draw(rbind(p1, p2, p3, size = "first"))
J'ai les mêmes largeurs mais maintenant je ne sais pas comment changer les hauteurs ...
Eh bien, quelqu'un peut-il m'aider à combiner les aspects hauteur et largeur pour un tracé final?
Essayez plot_grid
du package cowplot
:
library(ggplot2)
library(gridExtra)
library(cowplot)
p1 <- qplot(mpg, wt, data=mtcars)
p2 <- p1
p3 <- p1 + theme(axis.text.y=element_blank(), axis.title.y=element_blank())
plot_grid(p1, p2, p3, align = "v", nrow = 3, rel_heights = c(1/4, 1/4, 1/2))
avec gtable, vous devez définir manuellement les hauteurs des panneaux,
g1 <- ggplotGrob(p1)
g2 <- ggplotGrob(p2)
g3 <- ggplotGrob(p3)
library(gridExtra)
g <- rbind(g1, g2, g3)
set_panel_heights <- function(g, heights){
g$heights <- grid:::unit.list(g$heights) # hack until R 3.3 comes out
id_panels <- unique(g$layout[g$layout$name=="panel", "t"])
g$heights[id_panels] <- heights
g
}
g <- set_panel_heights(g, lapply(1:3, grid::unit, "null"))
grid::grid.draw(g)
Bien que légèrement verbeuse, cette approche est plus générale que de spécifier des hauteurs relatives: vous pouvez mélanger toutes sortes d’unités de grille,
grid::grid.newpage()
g <- do.call(rbind, replicate(3, ggplotGrob(ggplot()), simplify = FALSE))
g <- set_panel_heights(g, list(unit(1,"in"), unit(1,"line"), unit(1,"null")))
grid::grid.draw(g)