You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用类似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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 03:52:40