如何为含sec.axis的ggplot柱状+折线图添加正确图例?
解决ggplot双Y轴图表(柱状+折线)的图例显示问题
我之前在用ggplot的sec.axis命令创建双Y轴图表时,结合geom_bar(柱状图)和geom_line(折线图)遇到了头疼的图例问题:要么完全生成不了图例,要么图例统一都是方块,没法区分柱状图对应的方块图例和折线图对应的线条图例。试了好几个别人分享的代码都没达到预期效果,折腾了半天终于找到可行的解决方案,下面附上完整代码和关键要点:
关键思路
要让图例正确区分柱状和折线,核心是分别给柱状图和折线图指定对应的映射美学,并手动设置图例的样式:
- 给
geom_bar设置fill映射,对应柱状图例的方块 - 给
geom_line设置color映射,对应折线图例的线条 - 通过
scale_fill_manual和scale_color_manual统一图例名称和颜色 - 用
guides调整图例的显示形状,确保折线图例是线条样式
完整可运行代码
library(ggplot2) # 构造示例数据 df <- data.frame( category = c("A", "B", "C", "D"), bar_value = c(20, 35, 25, 40), line_value = c(1.2, 2.5, 1.8, 3.0) ) # 双Y轴图表绘制 ggplot(df, aes(x = category)) + # 柱状图:设置fill映射,对应图例方块 geom_bar(aes(y = bar_value, fill = "柱状数据"), stat = "identity", width = 0.5) + # 折线图:设置color映射,对应图例线条,size调整线条粗细 geom_line(aes(y = line_value * 15, color = "折线数据"), group = 1, size = 1.2) + geom_point(aes(y = line_value * 15, color = "折线数据"), size = 3) + # 双Y轴设置:右侧Y轴对应折线数据,调整缩放比例 scale_y_continuous( name = "柱状图数值", sec.axis = sec_axis(~ . / 15, name = "折线图数值") ) + # 手动设置填充和颜色,统一图例名称 scale_fill_manual(name = "数据类型", values = "steelblue") + scale_color_manual(name = "数据类型", values = "darkred") + # 调整图例:让折线图例显示为线条+点,柱状显示为方块 guides( fill = guide_legend(override.aes = list(shape = NA)), color = guide_legend(override.aes = list(fill = NA)) ) + theme_minimal() + labs(title = "双Y轴图表:柱状+折线", x = "类别")
效果说明
运行这段代码后,你会得到:
- 左侧Y轴对应柱状图数值,右侧Y轴对应折线图数值
- 图例中,柱状数据显示为蓝色方块,折线数据显示为红色线条+点,完美区分两种图表类型
内容的提问来源于stack exchange,提问作者Bileobio
相关产品推荐
相关产品推荐

