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

ggplot2堆叠柱状图自定义填充色及添加图例问题求助

问题解决:自定义堆叠柱状图颜色并显示正确图例

原代码的核心问题

  • 同时调用geom_col()和geom_bar(),属于重复绘图,会导致图层重叠
  • fill参数直接赋值broodstog$Year,未放入aes()中,ggplot无法识别分组规则来生成对应图例
  • Year是数值型变量,scale_fill_manual里的字符型年份标签无法匹配
  • aes中使用broodstog$列名的写法,不符合ggplot的规范(指定data后直接用列名即可)

修正后的完整代码

# 处理巢箱编号为因子(保留原数据顺序)
broodstog$`Nest-box.number.(x.brood)` <- factor(broodstog$`Nest-box.number.(x.brood)`, 
                                               levels = unique(broodstog$`Nest-box.number.(x.brood)`))
# 将Year转为因子,确保年份顺序正确
broodstog$Year <- factor(broodstog$Year, levels = c(2020, 2021, 2022))
# 定义年份对应的颜色映射
colour_map <- c("2020" = "#C7C7C7", "2021" = "#8A8A8A", "2022" = "#585858")

# 绘制堆叠柱状图
ggplot(broodstog, aes(x = `Nest-box.number.(x.brood)`, y = `N.(Carnus)`, fill = Year)) +
  geom_col() +  # geom_col等价于stat="identity"的geom_bar,只需保留一个
  scale_fill_manual(name = "年份", values = colour_map) +
  xlab("巢箱") + 
  ylab("收集到的Carnus hemapterus数量(N)") +
  ggtitle("被寄生的巢箱") +
  theme(
    axis.line = element_line(colour = 'black', size = 0.5),
    title = element_text(face = "plain", size = 12),
    plot.title = element_text(hjust = 0.5, vjust = 2),
    axis.text.x = element_text(angle = 45, hjust = 1),
    panel.background = element_blank()
  )

关键修改说明

  1. 将Year转为因子:把数值型的Year转成分类因子,让ggplot识别年份为分组变量,确保颜色映射精准匹配
  2. fill参数移入aes:将fill=Year放入aes(),让ggplot按年份分组着色并自动生成对应图例
  3. 移除重复图层:删掉重复的geom_bar(),仅保留geom_col()即可完成堆叠柱状图绘制
  4. 规范语法写法:直接使用列名代替broodstog$列名,代码更简洁且符合ggplot语法规范
  5. 简化theme代码:合并重复的theme调用,让代码结构更清晰

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 04:42:56