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() )
关键修改说明
- 将Year转为因子:把数值型的Year转成分类因子,让ggplot识别年份为分组变量,确保颜色映射精准匹配
- fill参数移入aes:将
fill=Year放入aes(),让ggplot按年份分组着色并自动生成对应图例 - 移除重复图层:删掉重复的
geom_bar(),仅保留geom_col()即可完成堆叠柱状图绘制 - 规范语法写法:直接使用列名代替
broodstog$列名,代码更简洁且符合ggplot语法规范 - 简化theme代码:合并重复的theme调用,让代码结构更清晰
内容的提问来源于stack exchange,提问作者Devon
相关产品推荐
相关产品推荐

