强制ggplot2显示堆叠柱状图与geom_line折线图的图例
ggplot2堆叠柱状图+折线图图例不显示问题解决
问题描述
使用ggplot2绘制堆叠柱状图(对应数据集Broods列)和折线图(对应Parasites列),两者基于同一数据集,但始终无法显示对应图例;同时需要隐藏坐标轴标注。
数据集
par_brood_2020 <- structure( list( `Prevalence-host.age.relationship` = c("<7 days", "7-10 days", "10-12 days", "12-15 days", "15-20 days", "20-25 days"), Broods = c(6, 6, 3, 2, 4, 1), Parasites = c(92, 66, 32, 9, 27, 5) ), row.names = c(NA, 6L), class = "data.frame" )
原代码问题分析
- 语法规范问题:直接在
aes()中用par_nest_2020$列名引用数据,不符合ggplot2的映射逻辑,易导致混乱 - 图层重复:
geom_col()和geom_bar(stat="identity")功能完全一致,无需重复调用 - 图例映射缺失:柱状图的
fill、折线图的col未放入aes()中,ggplot2无法识别这些视觉属性来生成图例 - 变量名不匹配:代码中使用
par_nest_2020,但提供的数据集是par_brood_2020;且代码中Nestlings列在数据集里不存在,推测是Broods的笔误
修正后的代码
library(ggplot2) ggplot(par_brood_2020, aes(x = `Prevalence-host.age.relationship`)) + # 绘制柱状图,将fill放入aes中定义图例项 geom_col(aes(y = Broods, fill = "Broods"), width = 0.6) + # 绘制折线图,将color放入aes中定义图例项,group=1确保折线连续 geom_line(aes(y = Parasites, color = "Parasites"), group = 1, linewidth = 1) + # 手动设置填充色和线条颜色,统一图例名称实现合并 scale_fill_manual(name = "", values = c("Broods" = "#808080")) + scale_color_manual(name = "", values = c("Parasites" = "#E60000")) + # 隐藏坐标轴标注 xlab("") + ylab("") + ggtitle("2020 - HOST-AGE RELATIONSHIP") + theme_classic() + theme( legend.key.size = unit(10, "pt"), axis.line.x = element_line(colour = 'black', size=0.5, linetype='solid'), axis.line.y = element_line(colour = 'black', size=0.5, linetype='solid'), 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() )
关键修正说明
- 将
fill(柱状图)和color(折线图)的视觉属性放入aes(),并指定对应的图例名称,让ggplot2生成对应的图例项 - 移除重复图层调用,精简代码
- 统一数据集和列名,修正笔误
- 通过
scale_fill_manual和scale_color_manual设置相同的图例名称,实现两个图例的合并显示
内容的提问来源于stack exchange,提问作者Devon
相关产品推荐
相关产品推荐

