如何用类似ggsave的方式保存非ggplot2生成的最后显示绘图?
如何用ggsave保存非ggplot2生成的绘图(不用png/dev.off)
说明
使用ggplot2搭配ggsave可以直接保存最后生成的ggplot绘图:
ggplot(data = data.frame(x = 1:10, y = 1:10), aes(x = x, y = y)) + geom_point() ggsave(filename = 'test.png', device = 'png')
但ggsave无法直接保存基础绘图系统(或非ggplot2生态)创建的绘图,比如用par(mfrow)排版的多图:
par(mfrow = c(1, 2)) plot(1:10) plot(10:1) par(mfrow = c(1, 1)) ggsave(filename = 'test.png', device = 'png')
背景
这类非ggplot绘图包括:
- 对特定对象调用基础
plot()函数生成的图 - 调用其他包中基于基础绘图系统的方法生成的图
同时需要解决用layout()替代par()排版时的同类保存问题。
需求
有没有办法不用png()+dev.off()的方式,通过贴近ggplot2工作流的方法(比如嵌入空ggplot图层),实现用ggsave保存这类非ggplot绘图?
解决方案
方法1:用gridGraphics转换基础绘图为ggplot兼容对象
gridGraphics可以将基础绘图转为grid对象,再嵌入到空ggplot中,从而支持ggsave保存:
library(ggplot2) library(gridGraphics) # 绘制基础绘图并记录 par(mfrow = c(1, 2)) plot(1:10) plot(10:1) par(mfrow = c(1, 1)) recorded_plot <- recordPlot() # 创建空ggplot并嵌入记录的绘图 p <- ggplot() + annotation_custom(grob = grid::grid.draw(recorded_plot), xmin = -Inf, xmax = Inf, ymin = -Inf, ymax = Inf) # 保存 ggsave(filename = 'test.png', plot = p, device = 'png')
方法2:用cowplot的ggdraw()简化操作
cowplot的ggdraw()可以直接将记录的基础绘图转为ggplot类对象,步骤更简洁:
library(ggplot2) library(cowplot) # 绘制并记录基础绘图 par(mfrow = c(1, 2)) plot(1:10) plot(10:1) par(mfrow = c(1, 1)) p <- ggdraw(recordPlot()) # 保存 ggsave(filename = 'test.png', plot = p, device = 'png')
适配layout()排版的情况
如果用layout()替代par()排版,操作逻辑完全一致,只需要替换对应的排版代码即可。例如:
library(ggplot2) library(cowplot) # 用layout排版绘图 lay <- matrix(c(1,2), nrow=1) layout(lay) plot(1:10) plot(10:1) layout(1) # 记录并转成ggplot对象保存 p <- ggdraw(recordPlot()) ggsave(filename = 'test_layout.png', plot = p, device = 'png')
内容的提问来源于stack exchange,提问作者user1
相关产品推荐
相关产品推荐

