如何保存多R命令绘制的图形为grob,以使用grid.arrange组合?
解决方案:将多命令绘制的基础R图形转为可排列的对象
不需要用截图保存JPEG,基础R的绘图可以通过以下两种方法转为可用于排列的对象,再用grid.arrange实现3列8行的复合布局:
方法1:使用recordPlot()记录绘图
recordPlot()可以捕获当前绘图设备上的所有内容,保存为recordedplot对象,后续可直接用于排列:
# 加载用于排列图形的gridExtra包 library(gridExtra) # 绘制并保存plot1 plot(c(2:20), c(2:20), ylab="", xlab="", axes=FALSE) par(new=TRUE) # 修正原代码语法错误:移除多余的嵌套c(),修正轴参数为xaxt="n" plot(c(1:18, 1:18), type="l", xlab="", ylab="", xaxt="n") plot1 <- recordPlot() # 清空当前设备,准备绘制下一个子图 dev.off() # 绘制并保存plot2 plot(c(2:20), c(2:20), ylab="", xlab="", axes=FALSE) par(new=TRUE) plot(c(1:18, 1:18), type="l", xlab="", ylab="", col=2, xaxt="n") plot2 <- recordPlot() dev.off() # 绘制并保存plot3 plot(c(2:20), c(2:20), ylab="", xlab="", axes=FALSE, col=3) par(new=TRUE) plot(c(1:18, 1:18), type="l", xlab="", ylab="", xaxt="n") plot3 <- recordPlot() dev.off() # 排列图形(扩展到8行24个图时,只需添加更多plot对象,设置ncol=3, nrow=8) grid.arrange(plot1, plot2, plot3, ncol=3)
方法2:使用ggplotify包直接转为grob对象
ggplotify的as.grob()函数可以将基础R绘图代码包裹为grob对象,无需手动清空设备,操作更简洁:
library(ggplotify) library(gridExtra) # 定义子图绘图逻辑,直接转为grob对象 plot1 <- as.grob(function() { plot(c(2:20), c(2:20), ylab="", xlab="", axes=FALSE) par(new=TRUE) plot(c(1:18, 1:18), type="l", xlab="", ylab="", xaxt="n") }) plot2 <- as.grob(function() { plot(c(2:20), c(2:20), ylab="", xlab="", axes=FALSE) par(new=TRUE) plot(c(1:18, 1:18), type="l", xlab="", ylab="", col=2, xaxt="n") }) plot3 <- as.grob(function() { plot(c(2:20), c(2:20), ylab="", xlab="", axes=FALSE, col=3) par(new=TRUE) plot(c(1:18, 1:18), type="l", xlab="", ylab="", xaxt="n") }) # 排列图形 grid.arrange(plot1, plot2, plot3, ncol=3)
关键提示
- 原代码存在两处语法错误:
c(1:18, c(1:18))多嵌套了一层c(),需改为c(1:18, 1:18);xact="n"应为xaxt="n"(用于隐藏x轴)。 - 截图保存JPEG会损失矢量图分辨率,且无法后续调整图形参数,不推荐使用。上述两种方法可保持图形的可编辑性和高质量。
内容的提问来源于stack exchange,提问作者Julii Brainard
相关产品推荐
相关产品推荐

