如何在R中合并多个已保存的非ggplot绘图?
合并基础R绘图(非ggplot)的解决方法
核心问题说明
基础R的plot()、hist()这类绘图函数不会返回可复用的绘图对象,你用p1 <- plot(...)存下来的其实是NULL,直接调用p1不会触发绘图,这就是par(mfrow)没起作用的原因。
方法1:直接在布局下依次绘图(最简单)
不需要提前保存绘图对象,先设置画布布局,再连续运行绘图代码:
# 设置2行2列的布局 par(mfrow = c(2, 2)) # 依次运行绘图代码 plot(1:10, rnorm(10), main = "图1") hist(rnorm(100), main = "图2") boxplot(rnorm(50) ~ sample(1:2, 50, replace = TRUE), main = "图3") plot(density(rnorm(100)), main = "图4")
运行后四个图会自动排列在同一张画布上。
方法2:先保存绘图对象再合并(适合循环生成场景)
如果必须通过循环提前生成并保存绘图,可以用recordPlot()捕获绘图状态:
# 初始化列表存绘图对象 plots_list <- list() # 循环生成并保存绘图 for(i in 1:4) { # 生成绘图 plot(1:10, rnorm(10), main = paste("图", i)) # 捕获当前绘图并存入列表 plots_list[[i]] <- recordPlot() # 关闭当前绘图设备,避免提前显示单图 dev.off() } # 合并绘图 par(mfrow = c(2, 2)) # 依次回放保存的绘图 for(p in plots_list) { replayPlot(p) }
方法3:用gridBase实现复杂布局
如果需要更灵活的排版(比如不同大小的子图),可以结合grid和gridBase包:
# 安装并加载包 install.packages("gridBase") library(grid) library(gridBase) # 创建新画布并设置2x2布局 grid.newpage() pushViewport(viewport(layout = grid.layout(2, 2))) # 逐个将基础R图放入对应位置 # 左上子图 pushViewport(viewport(layout.pos.row = 1, layout.pos.col = 1)) par(plt = gridPLT(), new = TRUE) plot(1:10, rnorm(10), main = "图1") popViewport() # 右上子图 pushViewport(viewport(layout.pos.row = 1, layout.pos.col = 2)) par(plt = gridPLT(), new = TRUE) hist(rnorm(100), main = "图2") popViewport() # 左下子图 pushViewport(viewport(layout.pos.row = 2, layout.pos.col = 1)) par(plt = gridPLT(), new = TRUE) boxplot(rnorm(50) ~ sample(1:2, 50, replace = TRUE), main = "图3") popViewport() # 右下子图 pushViewport(viewport(layout.pos.row = 2, layout.pos.col = 2)) par(plt = gridPLT(), new = TRUE) plot(density(rnorm(100)), main = "图4") popViewport()
内容的提问来源于stack exchange,提问作者RAN
相关产品推荐
相关产品推荐

