Plot multiple panels in one figure with ggplot2

ggplot2 is versatile but sometimes it also has limits. One example is that ggplot2 has difficulty in ploting multiple panels into one figure (like the built-in function par() ).

A solution for this comes from the “Cookbook for R”, in which provides a home made function “multiplot”. This function works with ggplot2 and can plot multiple panels into one single figure.

Users only need to plot figures using ggplot2 as usual, and at the end of the plotting, put all those figures together with the function multiplot.

1
2
3
4
5
6
7
p1 \<- ………..

p2 \<- ……….

p3 \<- ……….

multiplot(p1, p2, p3, cols=3)

For convenience, I paste the function in this blog, you may also go the original page to read more.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46

# Multiple plot function
#
# ggplot objects can be passed in ..., or to plotlist (as a list of ggplot objects)
# - cols: Number of columns in layout
# - layout: A matrix specifying the layout. If present, 'cols' is ignored.
#
# If the layout is something like matrix(c(1,2,3,3), nrow=2, byrow=TRUE),
# then plot 1 will go in the upper left, 2 will go in the upper right, and
# 3 will go all the way across the bottom.
#
multiplot \<- function(..., plotlist=NULL, file, cols=1, layout=NULL) {
library(grid)

# Make a list from the ... arguments and plotlist
plots \<- c(list(...), plotlist)

numPlots = length(plots)

# If layout is NULL, then use 'cols' to determine layout
if (is.null(layout)) {
# Make the panel
# ncol: Number of columns of plots
# nrow: Number of rows needed, calculated from # of cols
layout \<- matrix(seq(1, cols * ceiling(numPlots/cols)),
ncol = cols, nrow = ceiling(numPlots/cols))
}

if (numPlots==1) {
print(plots[\[1]()])

} else {
# Set up the page
grid.newpage()
pushViewport(viewport(layout = grid.layout(nrow(layout), ncol(layout))))

# Make each plot, in the correct location
for (i in 1:numPlots) {
# Get the i,j matrix positions of the regions that contain this subplot
matchidx \<- as.data.frame(which(layout == i, arr.ind = TRUE))

print(plots[\[i]()], vp = viewport(layout.pos.row = matchidx$row,
layout.pos.col = matchidx$col))
}
}
}

reference:
_http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2)/_

Here is an exmaple figure I draw based on this function.