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

