R - 将多重绘图保存到文件

M_V*_*len 28 r save ggplot2

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

首先,我不是一位经验丰富的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)
Run Code Online (Sandbox Code Playgroud)

这给出了期望的结果.当我尝试保存到文件时出现问题.我可以在RStudio中手动执行此操作(使用Export - > Save plot as image),但我想在脚本中运行所有内容.我设法只保存subplot1d(这是last_plot()),而不是完整的多时隙.

到目前为止我尝试过的:

  1. 使用ggsave

    ggsave(filename = "D:/R/plots/Myplots.jpg")
    
    Run Code Online (Sandbox Code Playgroud)

    这导致仅保存子图1d.

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

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

    这导致完全白色的图像(只是我假设的背景).print(Myplot)返回NULL.

不知道我在这里做错了什么.我缺乏理解R是我试图找到解决方案的原因.任何人都可以解释我做错了什么,也许建议一种方法来解决我的问题?

Spa*_*man 22

因为它Myplot是多重绘图函数的返回值,它不返回任何内容(它的作用是打印图形).您需要在打开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()
Run Code Online (Sandbox Code Playgroud)

应该管用.


dic*_*koa 17

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

png("chickweight.png")
multiplot(p1, p2, p3, p4, cols=2)
dev.off()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


Pau*_*tra 6

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

  • 从技术上讲,`arrangeGrob`不会创建"一个大的ggplot对象",它返回一个类"排列"的gTree,如果在子列表中有ggplots,那么该类也继承自"ggplot"来欺骗ggsave. (2认同)