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

ggplot2 geom_col分组填充问题:如何绘制分年份分模型的柱状图?

问题:修正ggplot代码实现分组柱状图

我需要绘制目标柱状图,要求用fill映射name字段(区分base与mother模型),按YEAR字段分组。尝试了以下代码但未得到预期效果:

test%>%ggplot(aes(as_factor(sector), value, fill=name, group=factor(YEAR)))+
  geom_col(position = "dodge", width=0.5)

数据结构

structure(list(value = c(45.7835023085923, 46.727175387221, 47.6992761579977, 
48.0597275867616, 50.7882757046681, 50.8768402521772, 42.7273124207896, 
43.9851413648616, 47.5599896653421, 47.8361505231604, 51.0693121296854, 
51.2675797116211, 45.0282059530599, 46.0840505213407), name = c("value_add_base_sector_total", 
"value_add_mother_sector_total", "value_add_base_sector_total", 
"value_add_mother_sector_total", "value_add_base_sector_total", 
"value_add_mother_sector_total", "value_add_base_sector_total", 
"value_add_mother_sector_total", "value_add_base_sector_total", 
"value_add_mother_sector_total", "value_add_base_sector_total", 
"value_add_mother_sector_total", "value_add_base_sector_total", 
"value_add_mother_sector_total"), YEAR = c(2011, 2011, 
2011, 2011, 2011, 2011, 2016, 2016, 2016, 2016, 2016, 2016, 2021, 
2021), sector = c("Catholic", "Catholic", "Government", "Government", 
"Independent", "Independent", "Catholic", "Catholic", "Government", "Government", 
"Independent", "Independent", "Catholic", "Catholic")), 
row.names = c(NA, -14L), class = c("tbl_df", "tbl", "data.frame"))

修正方案

原代码的问题在于group仅指定了YEAR,未结合name明确分组逻辑,导致柱子无法正确错开。以下是两种可行的修正方式:

方案1:调整分组逻辑,保留sector为x轴核心

适合需求为「每个部门下按年份分组,每组包含两个模型柱子」的场景:

library(ggplot2)

test %>%
  ggplot(aes(x = sector, y = value, fill = name, group = interaction(YEAR, name))) +
  geom_col(position = position_dodge(width = 0.7), width = 0.6) +
  labs(x = "部门", y = "数值", fill = "模型") +
  theme_minimal()
  • interaction(YEAR, name)确保每个年份下的不同模型作为独立分组,让柱子正确错开
  • 调整position_dodge和width参数可优化柱子间距,提升视觉效果

方案2:将部门与年份组合作为x轴类别

适合需要直接区分「部门+年份」组合的场景:

library(ggplot2)

test %>%
  ggplot(aes(x = interaction(sector, YEAR), y = value, fill = name)) +
  geom_col(position = position_dodge(width = 0.8), width = 0.7) +
  labs(x = "部门&年份", y = "数值", fill = "模型") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))
  • 直接用interaction(sector, YEAR)生成x轴类别,每个类别下展示两个模型的柱子
  • 添加文本倾斜样式避免x轴标签重叠

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 01:45:35