R语言如何捕获函数生成的多张绘图并存储为变量或列表元素
R语言捕获函数生成的多张base R绘图的解决方案
原理说明
base R的绘图是直接写入当前激活的图形设备,每次调用plot()默认会清空设备上的已有内容,你之前的写法是等所有绘图执行完后才调用recordPlot(),此时设备上仅保留最后一张图,因此只能捕获到最后一个结果。
方案1:可修改绘图函数源码时使用
直接在每次绘图完成后调用recordPlot(),将结果存入列表返回即可:
# 修改后的函数直接返回所有绘图的列表 someFunction <- function(){ plot_res <- list() plot(1:5, 1:5) plot_res[[1]] <- recordPlot() plot(1:5, 5:1) plot_res[[2]] <- recordPlot() plot(1:10, 1:10) plot_res[[3]] <- recordPlot() return(plot_res) } # 调用即可直接拿到所有绘图 all_plots <- someFunction() # 按需调用对应绘图,比如调用第2张 all_plots[[2]]
方案2:无法修改源码(如第三方包内置函数)时使用
通过trace()函数给plot()调用插入自动记录的钩子,无需修改原函数代码即可捕获所有生成的绘图:
# 初始化存储绘图的空列表 captured_plots <- list() # 给base::plot打追踪钩子,每次plot执行完成后自动记录当前绘图 trace(what = plot, exit = function() { captured_plots[[length(captured_plots) + 1]] <<- recordPlot() }) # 启动空图形设备并开启显示列表 pdf(NULL) dev.control(displaylist = "enable") # 直接调用原函数,无需做任何修改 someFunction() # 关闭设备,取消钩子避免影响后续plot调用 invisible(dev.off()) untrace(plot) # 调用对应绘图即可,比如调用第1张 captured_plots[[1]]
补充说明
如果绘图函数使用的是ggplot2体系而非base R绘图,可以用类似的追踪逻辑捕获ggplotGrob()的输出,或者直接修改函数返回ggplot对象即可。
捕获到的recordPlot对象可以直接打印调用,也可以用saveRDS()存储为本地文件后续加载使用。
内容的提问来源于stack exchange,提问作者canul
相关产品推荐
相关产品推荐

