如何将R中for循环生成、仅显示在plots窗格的绘图保存为SVG
解决方案
代码无效果的核心原因
par()等基础绘图系统的参数是和当前激活的绘图设备绑定的,你先在默认的RStudio Plots窗格设备上设置了mfrow布局,之后才打开svg输出设备,svg设备不会继承之前设备的参数设置,因此输出的文件不符合预期。
方案1:调整绘图设备开启顺序(适合批量生成绘图场景)
把设备开启、参数设置的步骤放在绘图代码之前即可,正确示例:
library(corrplot) data(cars) res.plot <- cor(cars) # 第一步:开启目标输出设备 svg(filename=paste0("Rplot_", Sys.time(), ".svg"), width = 8.27, height = 11.69) # 第二步:设置绘图参数,此时参数会应用到当前激活的svg设备 par(mfrow=c(3,2)) # 第三步:执行绘图逻辑 for (i in 1:6) { corrplot(res.plot) } # 第四步:关闭设备,完成文件写入 dev.off()
如果需要生成6张独立的svg而不是拼接为1张,把设备开启、参数设置、关闭设备的逻辑放到循环内部即可。
方案2:捕获已生成在Plots窗格的绘图(适合已跑完代码不想重跑的场景)
用R内置的recordPlot()可以直接捕获当前Plots窗格显示的全部绘图内容,不需要重新运行绘图代码:
# 捕获当前Plots窗格的绘图 saved_plot <- recordPlot() # 将捕获的绘图写入文件 svg("captured_plot.svg", width = 8.27, height = 11.69) replayPlot(saved_plot) dev.off()
如果需要批量导出历史绘图,可以用dev.list()查看所有已打开的设备,逐个切换捕获即可。
方案3:用ggsave直接保存当前绘图
ggsave不需要必须传入plot参数,默认会保存最近一次生成的绘图,基础绘图系统生成的图形也支持:
# 绘图代码运行完成、Plots窗格显示目标图形后,直接执行: library(ggplot2) ggsave("plot_output.svg", width = 8.27, height = 11.69)
内容的提问来源于stack exchange,提问作者brauer-t
相关产品推荐
相关产品推荐

