6

I have a working loop which generates and can save individual plots from each file saved in a directory.

I want to plot all of the returned plots in a single file as a 2x2 grid over multiple pages but cannot do this.

I have tried to save the plot objects in a list

pltList <- list()
pltList[]

for (f in 1:length(files)){
plot_object <- ggplot2(...)  #make ggplot2 plot
print(plot_object)
pltList[[f]] <- plot_object  #save ggplot2 plot in list
}

jpeg(filename.jpg)
par(mfrow=c(2,2))  #to generate 2x2 plot per page
print(pltList[[1]])
print(pltList[[2]])
...
print(pltList[[f]])
dev.off()

The problem is that the resulting saved .jpg file only contains the last plot and not a 2x2 grid of all plots over many pages which is what I want.

EDIT

My first problem is how to save each plot from the loop in the list - how can I view the saved objects from the list to make sure they have been saved correctly? When I do print(pltList[1]), the resulting output is:

function (x, y, ...) 
UseMethod("plot")
<bytecode: 0x0000000010f43b78>
<environment: namespace:graphics>

rather than the actual plot. It seems that the plots are not being saved in the list as expected. How can I correct for this? Hopefully, once this is fixed, your plotting suggestions will work.

4

2 Answers 2

8

I did recently the same. I used grid.arrange().

library(ggplot2)
library(gridExtra)
library(grid)

p1<-ggplot()+geom_line(aes(x=1:10,y=1:10))
p2<-ggplot()+geom_line(aes(x=1:10,y=1:10))
p3<-ggplot()+geom_line(aes(x=1:10,y=1:10)) 
p4<-ggplot()+geom_line(aes(x=1:10,y=1:10))
grid.arrange(p1,p2,p3,p4, ncol=1, top=textGrob("Multiple Plots", gp=gpar(fontsize=12, font = 2)))

enter image description here

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

1 Comment

and if the plots are in a list do.call(grid.arrange, c(pltList, ncol=2))
5

Assuming you need a PDF output where every page has multiple plots plotted as one, e.g.: if there are 12 plots then 4 plots per page.

Try this example:

library(ggplot2)
library(cowplot)

# list of 12 dummy plots, only title is changing.
pltList <- lapply(1:12, function(i){
  ggplot(mtcars,aes(mpg,cyl)) +
    geom_point() +
    ggtitle(paste("Title",i))})

# outputs 3 jpeg files with 4 plots each.
for(i in seq(1,12,4))
ggsave(paste0("Temp",i,".jpeg"),
       plot_grid(pltList[[i]],
                 pltList[[i+1]],
                 pltList[[i+2]],
                 pltList[[i+3]],nrow = 2))

# or we can output into 1 PDF with 3 pages using print
pdf("TempPDF.pdf")
for(i in seq(1,12,4))
  print(plot_grid(pltList[[i]],
            pltList[[i+1]],
            pltList[[i+2]],
            pltList[[i+3]],nrow = 2))
dev.off()

EDIT:

Another way using gridExtra, as suggested by @user20650:

library(gridExtra)

#output as PDF
pdf("multipage.pdf")

#use gridExtra to put plots together
marrangeGrob(pltList, nrow=2, ncol=2)

dev.off()

2 Comments

Good but I need all 3 pages saved in one file
@Bob See edit, we cannot have pages in JPEG, maybe you need PDF?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.