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

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")

关键调整说明

  1. 移除冗余代码:删掉原代码中无用的dummy字段,添加.groups = "drop"避免分组残留警告。
  2. 刻度映射转换:通过conv_factor将价格最大值匹配到计数轴最大值,让价格点分布在图表合理区间,不再集中在底部。
  3. 双轴转换逻辑修正:原代码的~. * 0.2转换方向错误,改为~. / conv_factor,将左侧计数轴的数值反向还原为真实价格,实现双轴对应。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:52:52