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

entrez la description de l'image ici

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

entrez la description de l'image ici

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

entrez la description de l'image ici

Eh bien, quelqu'un peut-il m'aider à combiner les aspects de hauteur et de largeur pour une intrigue finale?

24
demandé sur Chika 2016-03-24 13:52:28

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

entrez la description de l'image ici

26
répondu lukeA 2016-03-24 10:59:30

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) 

entrez la description de l'image ici

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) 

entrez la description de l'image ici

6
répondu baptiste 2016-03-24 21:31:47