Spécifiez les largeurs et les hauteurs des parcelles avec la grille.organiser
J'ai trois parcelles, et j'essaie de les combiner avec la grille.organiser. La dernière parcelle devrait avoir une hauteur plus petite que les deux premières parcelles et toutes les parcelles devraient 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 garde le texte et le titre sur l'axe des y, j'ai encore une largeur différente pour la troisième parcelle.
J'ai essayé d'ajouter la "largeur":
grid.arrange(arrangeGrob(p1,p2, ncol=1, nrow=2),
arrangeGrob(p3, ncol=1, nrow=1), heights=c(4,1), widths=c(2,1))
Mais il se transforme en un tracé à 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 de hauteur et de largeur pour une intrigue finale?
2 réponses
Essayez plot_grid
à partir du cowplot
paquet:
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 les hauteurs de panneaux manuellement,
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 qu'un peu 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)