web-dev-qa-db-fra.com

Spécifiez les largeurs et les hauteurs des parcelles avec grid.arrange

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

enter image description here

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 ...

enter image description here

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 ...

enter image description here

Eh bien, quelqu'un peut-il m'aider à combiner les aspects hauteur et largeur pour un tracé final?

38
Chika

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

enter image description here

38
lukeA

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) 

enter image description here

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) 

enter image description here

8
baptiste