3

在 R 中,我准备了多个ggplot2图形,它们保存到如下变量中:

flashplot <- ggplot(flash, aes(x=flash$Year, y=flash$Proc)) 
+ stat_smooth(method="lm", formula = "flash$Proc ~ poly(flash$Year, 2, raw=TRUE)", n=14, level=0.9) 
+ geom_point(shape=19) + ylab("Percentage of total existing versions") 
+ xlab("Years of Existence") + scale_x_continuous(breaks = c(0,2,4,6,8,10,12,14,16,18,20))

绘制单个图形按预期工作,但我想使用 multiplot 绘制 4 个图形(2 x 2),如R 食谱中所述

当我遇到错误时,我尝试了食谱中的示例,我认为它可以工作,但它给了我同样的错误:

> multiplot(p1, p2, p3, p4, cols=2)
Error in UseMethod("getModelInfo", model) : 
  no applicable method for 'getModelInfo' applied to an object of class "c('gg', 'ggplot')"

我在 Windows 7 下使用 R 2.15.2,以及最新的包ggplot2coefplot

> sessionInfo()
R version 2.15.2 (2012-10-26)
Platform: i386-w64-mingw32/i386 (32-bit)

locale:
[1] LC_COLLATE=German_Austria.1252  LC_CTYPE=German_Austria.1252   
[3] LC_MONETARY=German_Austria.1252 LC_NUMERIC=C                   
[5] LC_TIME=German_Austria.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] coefplot_1.1.8 ggplot2_0.9.3 

loaded via a namespace (and not attached):
 [1] colorspace_1.2-0   dichromat_1.2-4    digest_0.6.0       grid_2.15.2       
 [5] gtable_0.1.2       labeling_0.1       MASS_7.3-22        munsell_0.4       
 [9] plyr_1.8           proto_0.3-9.2      RColorBrewer_1.0-5 reshape2_1.2.2    
[13] scales_0.2.3       stringr_0.6.2      useful_1.1.6      

任何帮助我解决问题的提示将不胜感激。我错过了什么吗?我已经在网上搜索过,但没有发现任何有用的信息

-- 根据要求,这里是示例数据:

library(ggplot2)

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

# Second plot
p2 <- 
    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")

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

# Fourth plot
p4 <- 
    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) 

multiplot(p1, p2, p3, p4, cols=2)
4

2 回答 2

7

通过使用名为grid.arrange(). 您需要安装调用的包gridExtra才能使用它:

grid.arrange(p1,p2,p3,p4, ncol = 2, main = "Main title")

参考

于 2015-01-19T21:46:48.240 回答
1

问题解决了。我以为我应该使用包中的预定义multiplot函数coefplot,但实际上我必须使用自定义函数,该函数已在R 食谱页面上定义。

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))
    }
  }
}
于 2012-12-10T08:05:00.723 回答