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

如何为含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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:40:39