双Y轴柱状+折线图图例不显示及图例线型移除问题
解决ggplot双Y轴图表图例显示问题
问题分析
原代码存在三个核心问题导致图例无法正常显示且线型多余:
geom_bar同时在aes内部定义fill映射,又在外部设置fill=valuecolor,外部参数覆盖了映射关系,导致柱状图图例不生成。scale_fill_manual中错误引用了数据列ValueUS,而非自定义的颜色变量valuecolor。geom_line的颜色设置在外部,未参与图例映射,且用lty映射生成了多余的线型标记。
修正后的代码
valuecolor <- "#69b3a2" numbercolor <- rgb(0.2, 0.6, 0.9, 1) ggplot(data = ma) + # 柱状图:仅在aes内定义fill映射,移除外部fill参数 geom_bar(aes(x = Year, y = ValueUS, fill = "ValueUS"), stat = "identity", color="black", alpha=.4) + # 折线图:将color移至aes内映射,移除外部color参数,删除lty映射 geom_line(aes(x = Year, y = NumberUS/10, group = 1, color = "Number US deals"), size = 1) + scale_y_continuous(sec.axis = sec_axis(~.*10, name = "Number")) + # 统一图例名称,设置柱状图颜色 scale_fill_manual(name = "指标", values = c("ValueUS" = valuecolor)) + # 匹配图例名称,设置折线图颜色 scale_color_manual(name = "指标", values = c("Number US deals" = numbercolor)) + # 合并图例并调整样式:移除折线图例的线型标记,优化柱状图图例 guides(fill = guide_legend(override.aes = list(color = NA)), color = guide_legend(override.aes = list(fill = NA, linetype = 1))) + theme_ipsum()
关键修正说明
- 恢复映射关系:移除
geom_bar的外部fill参数,保留aes内的fill映射;将geom_line的color移至aes内,让两个元素的属性都参与图例生成。 - 统一图例:将
scale_fill_manual和scale_color_manual的name设为相同值(如"指标"),实现两个图例的合并。 - 移除多余线型:通过
guides的override.aes设置折线图的linetype=1(实线),同时确保图例仅显示颜色和对应图形,消除多余的线型标记。 - 修正颜色引用:将
scale_fill_manual中的ValueUS改为自定义的valuecolor,确保颜色正确映射。
内容的提问来源于stack exchange,提问作者Ayoze Alfageme
相关产品推荐
相关产品推荐

