| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| |
| # From http://www.cookbook-r.com/Graphs/Multiple_graphs_on_one_page_(ggplot2)/ |
| |
| # 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) { |
| 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 (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)) |
| } |
| } |
| } |
| |