Multiplot Code

Full Multiplot Code
multiplot <- function(..., plotlist = NULL, file, cols = 1, layout = NULL, title="",                        fontsize = 12, fontfamily = "Helvetica") { require(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 (nchar(title)>0){ layout <- rbind(rep(0, ncol(layout)), layout) }    if (numPlots==1) { print(plots 1 ) } else { # Set up the page grid.newpage pushViewport(viewport(layout = grid.layout(nrow(layout),                                                 ncol(layout),                                                  heights = if (nchar(title)>0) {unit(c(0.5, rep(5,nrow(layout)-1)), "null")}                                                 else {unit(c(rep(5, nrow(layout))), "null")}))) # Make each plot, in the correct location if (nchar(title)>0) { grid.text(title,                  vp = viewport(layout.pos.row = 1, layout.pos.col = 1:ncol(layout)),                  gp = gpar(fontsize = fontsize, fontfamily = fontfamily)) }      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)) }    }  }

Usage of multiplot
multiplot(p1, p5, p9,          p2, p6, p10,           p3, p7, p11,           p4, p8, p12, cols=4, title = "title", fontsize = 20)