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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 09:01:03