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

如何在ggplot中创建含反转次y轴柱状图的geom_line组合图?

解决ggplot2折线+反转次y轴柱状图的组合问题

问题修正点

  1. 柱状图同步次y轴反转:原代码的转换公式未让柱子高度随次y轴反转同步变化,需调整主y轴的y值计算逻辑,使C值越大,柱子高度越低,对应次y轴从130到90的反转方向。
  2. 添加A/B/C统一图例:需给折线图指定color映射、柱状图指定fill映射,再通过手动颜色配置合并图例。

修改后的代码

library(ggplot2)
library(tidyr) # 用于整理数据格式

Mydata = data.frame(ID=1:14, A=1:14, B=20:7, C=100:113)

# 将A/B整理成长格式,方便折线图的图例映射
Mydata_long <- pivot_longer(Mydata, cols = c(A, B), names_to = "指标", values_to = "数值")

ggplot() +
  # 绘制A/B折线图,通过color映射生成图例
  geom_line(data = Mydata_long, aes(x = ID, y = 数值, color = 指标), linewidth = 1) +
  # 绘制C的柱状图,y值转换对应反转次y轴,fill映射生成图例
  geom_bar(data = Mydata, aes(x = ID, y = (130 - C)*0.75, fill = "C"), 
           stat = "identity", alpha = 0.7, width = 0.8) +
  # 主y轴设置(对应A/B)
  scale_y_continuous(
    breaks = seq(0, 30, 5),
    name = "A/B数值",
    # 次y轴设置(对应C,反转从130到90)
    sec.axis = sec_axis(
      trans = ~130 - . / 0.75,
      breaks = seq(130, 90, -10),
      name = "C数值"
    )
  ) +
  # 手动设置折线和柱状图的颜色
  scale_color_manual(values = c("A" = "#2c7fb8", "B" = "#d95f02")) +
  scale_fill_manual(values = c("C" = "#7f7f7f")) +
  # 合并图例,统一标题
  guides(
    color = guide_legend(title = "指标"),
    fill = guide_legend(title = "指标")
  ) +
  labs(x = "ID") +
  theme_minimal()

关键说明

  • 柱状图转换逻辑:(130 - C)*0.75 将C的范围(100-113)转换为主y轴的对应区间(22.5-12.75),确保C值越大,柱子高度越低,完美匹配次y轴的反转方向。
  • 次y轴转换:~130 - . / 0.75 是主y轴到次y轴的逆转换,将主y轴数值还原为C的实际值,breaks=seq(130,90,-10) 实现轴标签从高到低的反转显示。
  • 图例生成:通过color(折线)和fill(柱状)的映射,配合手动颜色配置,将A、B、C三个系列整合到同一图例中。

内容的提问来源于stack exchange,提问作者Yang Yang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 11:20:30