Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Plot multiple ggplot2 on same page

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.

like image 387
Bob Avatar asked Dec 19 '22 23:12

Bob


2 Answers

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

like image 160
Alex Avatar answered Jan 10 '23 21:01

Alex


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()
like image 22
zx8754 Avatar answered Jan 10 '23 20:01

zx8754