【问题标题】:R - save multiplot to fileR - 将多图保存到文件
【发布时间】:2012-07-28 02:45:53
【问题描述】:

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

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

我想将这个所谓的多图保存到一个文件中(最好是 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 缺乏理解是我一直在寻找解决方案的原因。谁能解释我做错了什么,或许可以提出解决我问题的方法?

【问题讨论】:

  • 你也可以使用 gridExtra::grid.arrange(plot1a,plot1b,plot1c,plot1d, ncol = 2)
  • gridExtra 包不包含 grid.arrange,它包含似乎提供相同功能的arrangeGrob。我好像还记得有个函数叫grid.arrange,可能作者改了包里面的函数名吧。
  • grid.arrange 应该在 gridExtra 中。顺便说一句,arrangeGrobmultiplot 的好处之一是它与 ggsave 兼容,并且您可以存储复合 grob 以供以后使用。
  • 我只想提一下,jpeg 可能不是最佳选择。如果绘图最终应为光栅图像(而不是例如 pdf 或 eps),请改用 png。它使用无损压缩,即在文本或线条等对比鲜明的区域周围不会出现伪影。它的压缩也适用于具有单一颜色的大面积图像,例如绘图。

标签: r save ggplot2


【解决方案1】:

这是因为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()

应该可以。

【讨论】:

  • 真的就是这么简单!非常感谢您解释为什么我的方法不起作用。
【解决方案2】:

使用example code(R 食谱),它适用于我

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

【讨论】:

  • 你是对的,但你的代码与@M_Vermeulen 略有不同,她首先绘制了 4 个图,期望multiplot 返回一个网格对象。可能是grid.arrange 确实表现出这种行为?
  • @PaulHiemstra:我不认为我在这里采取了不同的方法,请查看示例页面。 @Spacedman 很好地解释了真正的问题。是的 grid.arrange 表现出相同的行为
  • 您的代码已经包含了@Spacedman 的修复,多图需要在调用png 内。
  • 无论如何要增加每个地块的大小?
【解决方案3】:

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

【讨论】:

  • 从技术上讲,arrangeGrob 不会创建“一个大的 ggplot 对象”,它会返回一个“arrange”类的 gTree,如果子列表中有 ggplot,那么该类也会继承从“ggplot”到愚弄ggsave。
猜你喜欢
  • 2018-02-07
  • 2017-06-25
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
  • 2013-05-31
  • 2013-03-16
  • 2017-11-29
相关资源
最近更新 更多