30

非常感谢您对以下问题的帮助。我知道几种将单个图保存到文件的方法。我的问题是:如何正确地将多图保存文件中?

首先,我不是一个有经验的 R 用户。我使用 ggplot2 来创建我的绘图,我可能应该提到的另一件事是我使用 RStudio GUI。使用 R Cookbook 中的示例 ,我可以在一个窗口中创建多个绘图。

我想将这个所谓的多图保存到一个文件中(最好是 jpeg),但不知何故未能做到这一点。

我正在创建多图如下:

##define multiplot function
    multiplot <- function(..., plotlist=NULL, cols) {
        require(grid)

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

        numPlots = length(plots)

        # Make the panel
        plotCols = cols                          # Number of columns of plots
        plotRows = ceiling(numPlots/plotCols) # Number of rows needed, calculated from # of cols

        # Set up the page
        grid.newpage()
        pushViewport(viewport(layout = grid.layout(plotRows, plotCols)))
        vplayout <- function(x, y)
            viewport(layout.pos.row = x, layout.pos.col = y)

        # Make each plot, in the correct location
        for (i in 1:numPlots) {
            curRow = ceiling(i/plotCols)
            curCol = (i-1) %% plotCols + 1
            print(plots[[i]], vp = vplayout(curRow, curCol ))
        }

    }

## define subplots (short example here, I specified some more aesthetics in my script)
plot1a <- qplot(variable1,variable2,data=Mydataframe1)
plot1b <- qplot(variable1,variable3,data=Mydataframe1)  
plot1c <- qplot(variable1,variable2,data=Mydataframe2)
plot1d <- qplot(variable1,variable3,data=Mydataframe2)  

## plot in one frame
Myplot <- multiplot(plot1a,plot1b,plot1c,plot1d, cols=2)

这给出了期望的结果。当我尝试保存到文件时出现问题。我可以在 RStudio 中手动执行此操作(使用导出 -> 将绘图另存为图像),但我想在脚本中运行所有内容。我设法只保存 subplot1d(即 last_plot()),而不是完整的多图。

到目前为止我已经尝试过:

  1. 使用 ggsave

    ggsave(filename = "D:/R/plots/Myplots.jpg")
    

    这导致仅保存子图 1d。

  2. 使用 jpeg()、print() 和 dev.off()

    jpeg(filename = "Myplot.jpg", pointsize =12, quality = 200, bg = "white", res = NA, restoreConsole = TRUE)
    print(Myplot)
    dev.off()
    

    这会产生一个完全白色的图像(只是我假设的背景)。print(Myplot) 返回 NULL。

不知道我在这里做错了什么。我对 R 缺乏理解是我一直在寻找解决方案的原因。谁能解释我做错了什么,也许可以提出解决我问题的方法?

4

3 回答 3

24

因为它Myplot是你的 multiplot 函数的返回值,它什么也不返回(它的工作是打印图表)。您需要在 jpeg 设备打开的情况下调用 multiplot:

jpeg(filename = "Myplot.jpg", pointsize =12, quality = 200, bg = "white", res = NA, restoreConsole = TRUE)
multiplot(plot1a,plot1b,plot1c,plot1d, cols=2)
dev.off()

应该管用。

于 2012-07-30T12:26:35.257 回答
19

使用示例代码(R 食谱),它适用于我

png("chickweight.png")
multiplot(p1, p2, p3, p4, cols=2)
dev.off()

在此处输入图像描述

于 2012-07-30T12:29:18.810 回答
7

为了完整起见,ggsave它不起作用,因为它只保存最后打印的 ggplot 对象,在你的情况下它只是最后一个图。这是因为 multiplot 通过将 ggplot 对象绘制到整个图形设备的不同子集来创建绘图。另一种方法是通过将 ggplot 对象组合成一个大 ggplot 对象来创建绘图,然后打印该对象。这将与ggsave. 这种方法是arrangeGrobgridExtra包中实现的。

于 2012-07-30T15:19:56.233 回答