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

ggplot2中使用for循环绘制多组合图的实现方案咨询

问题根因

par() 是R基础绘图(base plot)体系的布局控制函数,仅对基础绘图函数生成的图形生效,而ggplot2基于grid绘图体系,二者不兼容,因此你设置的par布局不会对ggplot输出的子图生效。

可行实现方案

这里提供两种可通过for循环实现15张ggplot子图排布的方案:

方案1:使用gridExtra包实现(兼容性最好)

该方案先把循环生成的所有ggplot对象存储到列表中,最后统一调用多图排布函数输出组合图,15张子图可以按3行5列/5行3列排布:

# 先加载需要的包
library(ggplot2)
library(gridExtra)

vecB <- df2[,17:31]
# 创建空列表存储所有子图
plot_list <- list()

for (i in seq_along(vecB)){
  # 生成子图存入列表,优化了aes写法,避免unlist导致的变量映射问题
  plot_list[[i]] <- ggplot(vecB, aes(x = .data[[names(vecB)[i]]], stat = "count")) +
          geom_bar(width = 0.65, fill = "cadetblue3") +
          geom_text(stat = 'count', aes(label = ..count..), vjust = -0.5, size = 3) +
          scale_y_continuous(limits = c(0, 225)) +
          scale_x_continuous(limits = c(0.5, 5.5)) +
          theme_light() +
          labs(x = paste0('B', i, '作答分數'), y = '次數')
}

# 统一输出组合图,3行5列刚好放15张
do.call(grid.arrange, c(plot_list, nrow = 3, ncol = 5))

方案2:使用patchwork包实现(语法更简洁)

如果偏好更简洁的排布语法,可以使用patchwork包的wrap_plots函数直接对存储了子图的列表做排布:

# 先加载需要的包
library(ggplot2)
library(patchwork)

vecB <- df2[,17:31]
plot_list <- list()

for (i in seq_along(vecB)){
  plot_list[[i]] <- ggplot(vecB, aes(x = .data[[names(vecB)[i]]], stat = "count")) +
          geom_bar(width = 0.65, fill = "cadetblue3") +
          geom_text(stat = 'count', aes(label = ..count..), vjust = -0.5, size = 3) +
          scale_y_continuous(limits = c(0, 225)) +
          scale_x_continuous(limits = c(0.5, 5.5)) +
          theme_light() +
          labs(x = paste0('B', i, '作答分數'), y = '次數')
}

# 直接排布所有子图
wrap_plots(plot_list, nrow = 3, ncol = 5)

额外说明

两种方案都支持自定义子图间距、统一调整坐标轴等需求,可根据自己的使用习惯选择。

内容的提问来源于stack exchange,提问作者user17491022

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:06:04