如何在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
相关产品推荐
相关产品推荐

