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
相关产品推荐
相关产品推荐

