ggplot2:如何让叠加的点适配次级Y轴范围
双Y轴图表调整:让价格点匹配左侧计数轴范围
问题场景
左侧Y轴是钻石数量计数(范围05000),右侧Y轴是平均价格(范围0600),但当前代表平均价格的点因数值远小于计数,全部集中在图表底部,无法合理展示。
修改方案
核心思路是把价格值映射到左侧计数轴的刻度范围,再通过双轴转换逻辑还原右侧价格显示,代码调整如下:
library(ggplot2) library(tidyverse) # 计算各分组平均价格,保留原始值 price.avg <- diamonds %>% group_by(cut, color) %>% summarise(price = mean(price), .groups = "drop") # 获取左侧计数轴的最大值,用于刻度映射 max_count <- diamonds %>% count(cut, color) %>% pull(n) %>% max() # 计算价格与计数轴的转换系数:让价格最大值对应计数最大值 max_price <- max(price.avg$price) conv_factor <- max_count / max_price # 将价格转换到左侧计数轴的范围 price.avg <- price.avg %>% mutate(price_scaled = price * conv_factor) # 绘制图表 diamonds %>% ggplot() + geom_bar(aes(x = cut, fill = clarity)) + facet_wrap(~ color) + ylab("数量") + xlab("切工") + geom_point(data = price.avg, aes(x = cut, y = price_scaled, col = ""), size = 3) + scale_y_continuous( sec.axis = sec_axis(~. / conv_factor, name = "平均价格") ) + scale_color_manual(name = "", label = "平均价格", values = "black")
关键调整说明
- 移除冗余代码:删掉原代码中无用的
dummy字段,添加.groups = "drop"避免分组残留警告。 - 刻度映射转换:通过
conv_factor将价格最大值匹配到计数轴最大值,让价格点分布在图表合理区间,不再集中在底部。 - 双轴转换逻辑修正:原代码的
~. * 0.2转换方向错误,改为~. / conv_factor,将左侧计数轴的数值反向还原为真实价格,实现双轴对应。
内容的提问来源于stack exchange,提问作者hnguyen
相关产品推荐
相关产品推荐

