如何在ggplot中创建含反转次y轴柱状图的geom_line组合图?
解决ggplot2折线+反转次y轴柱状图的组合问题
问题修正点
- 柱状图同步次y轴反转:原代码的转换公式未让柱子高度随次y轴反转同步变化,需调整主y轴的y值计算逻辑,使C值越大,柱子高度越低,对应次y轴从130到90的反转方向。
- 添加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
相关产品推荐
相关产品推荐

