3

I have 12 plots generated by a loop and I want to plot them with 3 rows and 2 columns on one page (2 pages in total). I know how to do it in R

pdf("1.pdf") par(mfrow = c(3, 2)) for (i in 1:12) { x <- 1:10 y <- 2*x + rnorm(x) plot(x, y) } dev.off() 

But how to do this using ggplot?

library(ggplot2) library(grid) library(gridExtra) for (i in 1:12) { x <- 1:10 y <- 2*x + rnorm(x) qplot(x, y) } 

I think I have to use grid.arrange but need some help on that. Thanks.

1
  • check this is useful Commented Feb 19, 2016 at 13:58

2 Answers 2

5

You might want to take a look at the cowplot package that allows more flexibility than just using a naked grid.arrange.

This works - albeit a bit inelegantly:

library(ggplot2) library(grid) library(gridExtra) lg <- list() for (i in 1:12) { x <- 1:10 y <- 2*x + rnorm(x) lg[[i]] <- qplot(x, y) } grid.arrange(lg[[1]],lg[[2]],lg[[3]],lg[[4]],lg[[5]],lg[[6]],nrow=3,ncol=2) grid.arrange(lg[[7]],lg[[8]],lg[[9]],lg[[10]],lg[[11]],lg[[12]],nrow=3,ncol=2) 

Another more elegant but somewhat obtuse way to do the grid.arrange is the following (thanks to Axeman and beetroot - note the comments).

do.call(grid.arrange, c(lg[1:6], nrow = 3)) do.call(grid.arrange, c(lg[7:12], nrow = 3)) 

or this:

grid.arrange(grobs = lg[1:6], ncol=2) grid.arrange(grobs = lg[7:12], ncol=2) 

They all result in this - (think two of these - they look the same anyway):

enter image description here

Sign up to request clarification or add additional context in comments.

4 Comments

You could do do.call(grid.arrange, c(lg[1:6], nrow = 3)) and do.call(grid.arrange, c(lg[7:12], nrow = 3))
s. here about grid.arrange using a list: grid.arrange(grobs = lg[1:6], ncol=2)
I am also thinking he might like cowplot better.
Ok, thanks @Axeman and beetroot. Was surprised I got this in there, it hung around for 26 minutes before I noticed it. :) I will add those as comments as I think the way it is is more didactic.
2

marrangeGrob is a convenient wrapper for multiple pages,

marrangeGrob(lg, ncol=2, nrow=3) 

or you can call grid.arrange() explicitly twice,

grid.arrange(grobs = lg[1:6], ncol=2) grid.arrange(grobs = lg[7:12], ncol=2) 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.