ggplot2双Y轴主Y轴最小值设为0的问题求助
解决ggplot2双Y轴主Y轴最小值设为0的问题
问题根源
你当前代码用min(stats$avg_asking_rate)计算偏移量,导致主Y轴起点不是0,同时瓷砖图的位置逻辑错误,引发边缘间隙和数据显示异常。要实现主Y轴最小值为0且保留原图表样式,需重新调整双轴映射规则并修正瓷砖图参数。
修改后的代码
# 计算两组数据的最大值,用于双轴范围匹配 max_rate <- max(stats$avg_asking_rate) max_availability <- max(stats$availability_rate) # 生成转换系数,让availability_rate的范围适配主Y轴0到max_rate的区间 coeff <- max_rate / max_availability stats %>% ggplot(aes(x = `Snapshot Date`))+ ggtitle("Rent ($/SF NNN) (%)") + # 修正瓷砖图位置:y设为数值的一半,高度为数值本身,确保从主Y轴0点开始 geom_tile(aes(y = avg_asking_rate/2, height = avg_asking_rate, width = 70, fill = "Avg. Asking Rate")) + # 对availability_rate做系数转换,匹配主Y轴数值范围 geom_line(aes(y = availability_rate * coeff, colour = "Availability Rate"), size = 1)+ scale_x_date(name = NULL, breaks = quarter_labels[, "Snapshot Date", drop=T], labels = quarter_labels[, "qlabel", drop=T])+ scale_y_continuous(name = NULL, # 强制主Y轴范围从0到avg_asking_rate的最大值 limits = c(0, max_rate), breaks = scales::breaks_pretty(n = 5), # 次Y轴反向转换,还原availability_rate的真实数值 sec.axis = sec_axis(~./coeff, breaks = scales::breaks_pretty(n = 5))) + scale_fill_manual(name = NULL, values = c("Avg. Asking Rate" = secondary_pal[5]), guide = guide_legend(order = 1))+ scale_colour_manual(name = NULL, values = c("Availability Rate" = primary_pal[4]), guide = guide_legend())
修改说明
- 双轴映射逻辑重构:通过转换系数
coeff将availability_rate的数值范围缩放到与主Y轴0到avg_asking_rate最大值的区间匹配,避免轴偏移导致的显示错乱。 - 瓷砖图参数修正:将瓷砖图的
y参数改为avg_asking_rate/2,height设为avg_asking_rate,确保瓷砖从主Y轴0点向上延伸,消除边缘间隙。 - 主Y轴范围强制设置:在
scale_y_continuous中添加limits = c(0, max_rate),确保主Y轴最小值固定为0。
原始图表参考

内容的提问来源于stack exchange,提问作者wigglesthe3rd
相关产品推荐
相关产品推荐

