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

如何在ggplot2中缩放geom_col(position=fill)适配折线图Y轴范围

在ggplot2中不使用副轴,将填充柱形图缩放至折线图Y轴范围

解决思路

核心是把position=fill生成的0-1范围的柱形比例,乘以total_rate的最大值,将柱形图的Y轴范围映射到折线图的数值区间,同时保留填充柱形的相对比例关系。

完整代码示例

1. 构造数据框

df <- data.frame(
  year = c(2010,2010,2010,2010,2010,2011,2011,2011,2011,2011,2011,2012,2012,2012,2012,2012,2012,2013,2013,2013,2013,2013,2013,2014,2014,2014,2014,2014,2014,2015,2015,2015,2015,2015,2015,2016,2016,2016,2016,2016,2016,2017,2017,2017,2017,2017,2017,2018,2018,2018,2018,2018,2018,2019,2019,2019,2019,2019,2019),
  group = c(1,2,3,4,6,1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6,1,2,3,4,5,6),
  count = c(183,188,221,67,67,201,244,204,141,3,62,160,187,199,244,2,64,197,303,217,272,13,88,143,204,162,313,137,305,174,129,149,314,310,647,220,80,155,191,429,1123,242,37,120,94,366,1279,242,8,130,45,439,1374,238,13,74,14,363,1513),
  total_rate = c(11.05644,11.05644,11.05644,11.05644,11.05644,12.92794,12.92794,12.92794,12.92794,12.92794,12.92794,12.84706,12.84706,12.84706,12.84706,12.84706,12.84706,16.23639,16.23639,16.23639,16.23639,16.23639,16.23639,18.69105,18.69105,18.69105,18.69105,18.69105,18.69105,25.35976,25.35976,25.35976,25.35976,25.35976,25.35976,32.21170,32.21170,32.21170,32.21170,32.21170,32.21170,31.16714,31.16714,31.16714,31.16714,31.16714,31.16714,32.51662,32.51662,32.51662,32.51662,32.51662,32.51662,32.13637,32.13637,32.13637,32.13637,32.13637,32.13637)
)

2. 计算total_rate的最大值

max_total_rate <- max(df$total_rate)

3. 绘制叠加图

library(ggplot2)

ggplot(df, aes(x = year)) +
  # 缩放填充柱形图至total_rate最大值区间
  geom_col(
    aes(y = after_stat(fill) * max_total_rate, fill = factor(group)),
    position = "fill",
    alpha = 0.7 # 可选:添加透明度避免遮挡折线
  ) +
  # 折线图使用原始total_rate数据
  geom_line(
    aes(y = total_rate, group = 1),
    color = "black",
    linewidth = 1
  ) +
  # 设置Y轴范围匹配total_rate(加5%边距优化视觉)
  scale_y_continuous(limits = c(0, max_total_rate * 1.05)) +
  labs(x = "年份", y = "Total Rate", fill = "分组") +
  theme_minimal()

关键说明

  • after_stat(fill):获取position="fill"计算后的分组相对比例(0-1),这是缩放柱形的核心依据
  • 乘以max_total_rate后,柱形图的高度被映射到0到max_total_rate的区间,和折线图Y轴完全对齐
  • 填充柱形的相对占比保持不变,依然能直观对比各分组的比例关系
  • 无需副轴,完美兼容geofacet的使用场景

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:15:39