Here's an alternative way to use gtable :
library(gtable) gtable_add_grobs <- gtable_add_grob #misleading name g <- gtable(widths = unit(rep(1, 6), "null"), # need lcm(3,2)=6 for the matrix rows heights = unit(rep(1, 2), "null")) #gtable_show_layout(g) g <- gtable_add_grobs(g, lapply(list(p1, p2, p3, p4, p5), ggplotGrob), t = c(1, 1, 1, 2, 2), l = c(1, 3, 5, 2, 4), r = c(2, 4, 6, 3, 5)) grid.newpage() grid.draw(g)
Edit: in order for the lower charts to cover the entire width, you just need to change the corresponding l and r indices,
g <- gtable_add_grobs(g, lapply(list(p1, p2, p3, p4, p5), ggplotGrob), t = c(1, 1, 1, 2, 2), l = c(1, 3, 5, 1, 4), r = c(2, 4, 6, 3, 6))