Multiple ggplots of different sizes
You can use nested arrangeGrob
calls like this example:
library(ggplot2)library(gridExtra)p <- ggplot(data.frame(x=1, y=1), aes(x,y)) + geom_point()grid.arrange( arrangeGrob( p, arrangeGrob(p, p, nrow=2), ncol=2 ,widths=c(2,1)), arrangeGrob(p, p ,p ,ncol=3, widths=rep(1,3)), nrow=2)
Edit:
gl <- lapply(1:9, function(ii) grobTree(rectGrob(),textGrob(ii)))grid.arrange( arrangeGrob(gl[[1]], do.call(arrangeGrob, c(gl[2:5], ncol=2)), nrow=1, widths=3:2), do.call(arrangeGrob, c(gl[6:9], nrow=1, list(widths=c(1,1,1,2)))),nrow=2, heights=c(2,1))
An alternative with gtable
library(gtable)gl <- lapply(1:9, function(ii) grobTree(textGrob(ii), rectGrob()))# gl <- lapply(1:9, function(ii) ggplotGrob(qplot(1,1) + ggtitle(ii)))gt <- gtable(widths=unit(rep(1,5), "null"), heights=unit(rep(1,3), "null"))gtable_add_grobs <- gtable_add_grob # aliasgt <- gtable_add_grobs(gt, gl, l=c(1,4,5,4,5,1,2,3,4), r=c(3,4,5,4,5,1,2,3,5), t=c(1,1,1,2,2,3,3,3,3), b=c(2,1,1,2,2,3,3,3,3))grid.newpage()grid.draw(gt)
You can use the same matrix interface as layout with grid.arrange
,
library(gridExtra)library(grid)gl <- lapply(1:9, function(ii) grobTree(rectGrob(), textGrob(ii)))grid.arrange(grobs = gl, layout_matrix = rbind(c(1,1,1,2,3), c(1,1,1,4,5), c(6,7,8,9,9)))
and the same works for ggplots; note that NA can be used to indicate blank cells. The result is a gtable, compatible with ggsave()
.
gl <- replicate(9, ggplot(), FALSE)grid.arrange(grobs = gl, layout_matrix = rbind(c(1,1,1,2,3), c(1,1,1,4,5), c(6,7,8,NA,9)))