我想在大型 for 循环期间将多个绘图(使用 ggplot2)保存到列表中。然后随后在网格中显示图像(使用 grid.arrange)
我试过两种解决方法: 1 将其存储在列表中,如下所示:
pltlist[["qplot"]] <- qplot
但是由于某种原因,这确实正确地保存了情节。 所以我采用了第二种策略,即 recordPlot() 这能够正确保存情节,但无法 在网格中使用它。
可重现的例子:
require(ggplot2);require(grid);require(gridExtra)
df <- data.frame(x = rnorm(100),y = rnorm(100))
histoplot <- ggplot(df, aes(x=x)) + geom_histogram(aes(y=..density..),binwidth=.1,colour="black", fill="white")
qplot <- qplot(sample = df$y, stat="qq")
pltlist <- list()
pltlist[["qplot"]] <- qplot
pltlist[["histoplot"]] <- histoplot
grid.arrange(pltlist[["qplot"]],pltlist[["histoplot"]], ncol=2)
上面的代码有效但产生了错误的图表 在我的实际代码中
然后我尝试了 recordPlot()
print(histoplot)
c1 <- recordPlot()
print(qplot)
c2 <- recordPlot()
我可以单独显示所有的图 但是 grid.arrange 产生错误:
grid.arrange(replayPlot(c1),replayPlot(c2), ncol=2) # = Error
gList(list(wrapvp = list(x = 0.5, y = 0.5, width = 1, height = 1, : “gList”中只允许“grobs”
在此线程中 Saving grid.arrange() plot to file 他们讨论了一个使用 arrangeGrob() 的解决方案
arrangeGrob(c1, c1, ncol=2) # Error
vapply(x$grobs, as.character, character(1)) 中的错误: 值的长度必须为 1, 但是 FUN(X[[1]]) 结果是长度 3
我被迫使用 recordPlot() 而不是保存到列表中,因为这在保存时不会生成与立即绘制时相同的图形,很遗憾,我无法复制,抱歉。
在我的实际代码中,我正在执行一个大型 for 循环,遍历多个变量,与每个变量建立关联并绘制散点图,其中我根据它们的有效位来命名散点图。然后我想在动态 knitr 报告中重新显示网格中重要的图。
我知道我可以在 for 循环之后重新绘制重要的图而不是保存它们(我也无法在执行 knitr 时另存为 png)。不过,我想找到一种方法将绘图动态保存为 R 对象,然后在网格中重新绘制它们。
感谢阅读
“R 版本 3.2.1” Windows 7 64 位 - RStudio - 版本 0.99.652 附加基础包: [1] grid grDevices datasets utils graphics stats methods base
其他附包: [1] gridExtra_2.0.0 ggplot2_1.0.1
最佳答案
我可以想到两种解决方案。
<强>1。如果您的目标只是将绘图列表保存为 R 对象,我建议:
saveRDS(object = pltlist, file = "file_path")
这样,当您希望重新加载这些图表时,您只需使用 readRDS()
。然后,您可以将它们放入 cowplot
或 gridarrange
中。此命令适用于所有列表和 R 对象。
这种方法的一个警告是,如果 ggplot2 的设置/标记取决于环境中的事物(不是数据,而是诸如点大小、形状或颜色的设置之类的东西)而不是用于制作图形的 ggplot2 函数),你的图表将无法工作,直到你恢复你的依赖关系。保存一些依赖项的原因之一是模块化您的脚本以制作图表。
另一个注意事项是性能:根据我的经验,我发现当您有大量图表(100 多个图表)时,读取数据和重新制作单个图表实际上比加载所有图表的 RDS 文件更快.
<强>2。如果您的目标是保存每个图形的“图像”或“图片”(单图和/或多图,如 .png、.jpeg 等),然后在 R 之外手动调整网格中的内容,例如作为 powerpoint 或 photoshop,我建议:
filenames <- c("Filename_1", "Filename_2") #actual file names you want...
lapply(seq_along(pltlist), function(i) {
ggsave(filename = filenames[i], plot = pltlist[[i]], ...) #use your settings here
})
我喜欢的单图设置:
lapply(seq_along(pltlist), function(i) ggsave(
plot = pltlist[[i]],
filename = paste0("plot_", i, "_", ".tiff"), #you can even paste in pltlist[[i]]$labels$title
device = "tiff", width=180, height=180, units="mm", dpi=300, compression = "lzw", #compression for tiff
path = paste0("../Blabla") #must be an existing directory.
))
如果您真的对网格排列有强制症,并且您没有太多要发布的网格,则您可能想要采用手动方法。否则,当您执行 grid.arrange 时,您需要在那里执行所有规范(调整字体、增加轴标签大小、自定义颜色等),然后相应地调整宽度和高度。
关于r - 将多个 ggplot2 图保存为列表中的 R 对象并在网格中重新显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31947727/