ggplot2-一页多图(不同来源, 灵活绘制)(转载)

来源:互联网 发布:现在做淘宝很难 编辑:程序博客网 时间:2024/05/28 18:44

转自:http://blog.csdn.net/tanzuozhev/article/details/51112223


ggplot2 的分面(facet)可以绘制一页多图, 但是必须是来自同一个数据集的图形,局限性很大. 如果我们有多个不同来源的图形,想绘制到一张图上又该如何处理呢? multiplot提供了极为强大的函数功能.

multiplot可以设置行列, 也可以设置一个矩阵进行布局.

# 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))    }  }}

范例

library(ggplot2)# This example uses the ChickWeight dataset, which comes with ggplot2# 图1p1 <- ggplot(ChickWeight, aes(x=Time, y=weight, colour=Diet, group=Chick)) +    geom_line() +    ggtitle("Growth curve for individual chicks")p1

# 图2p2 <- ggplot(ChickWeight, aes(x=Time, y=weight, colour=Diet)) +    geom_point(alpha=.3) +    geom_smooth(alpha=.2, size=1) +    ggtitle("Fitted growth curve per diet")p2
## geom_smooth: method="auto" and size of largest group is <1000, so using loess. Use 'method = x' to change the smoothing method.

# 图3p3 <- ggplot(subset(ChickWeight, Time==21), aes(x=weight, colour=Diet)) +    geom_density() +    ggtitle("Final weight, by diet")p3

# 图4p4 <- ggplot(subset(ChickWeight, Time==21), aes(x=weight, fill=Diet)) +    geom_histogram(colour="black", binwidth=50) +    facet_grid(Diet ~ .) +    ggtitle("Final weight, by diet") +    theme(legend.position="none")        # No legend (redundant in this graph)   p4

合并为一张图

multiplot(p1, p2, p3, p4, cols=2)
## geom_smooth: method="auto" and size of largest group is <1000, so using loess. Use 'method = x' to change the smoothing method.


原创粉丝点击