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

GGPlot绘制双Y轴:添加次坐标轴后主Y轴范围异常问题求助

问题核心原因

你遇到的问题本质是ggplot2的次坐标轴(sec.axis)仅负责坐标轴刻度的映射显示,不会自动缩放第二个数据系列的数值范围。你原代码中geom_line直接使用了数值为18~21的Level数据绘图,ggplot会自动合并所有geom图层的y值范围来确定主Y轴区间,因此主Y轴被撑大到和Level数值匹配的范围,导致小数值的Level_Change被压缩。

具体修改方案

核心逻辑是先将Level数据缩放到和Level_Change一致的数值区间再绘图,次坐标轴通过反向映射公式显示Level的真实值,修改后完整代码如下:

Data %>%
  # 自动计算缩放参数,适配当前数据范围,无需手动调整固定值
  mutate(
    level_min = min(Level, na.rm = T),
    level_max = max(Level, na.rm = T),
    lc_min = min(Level_Change, na.rm = T),
    lc_max = max(Level_Change, na.rm = T),
    # 将Level线性缩放到Level_Change的数值区间
    scaled_Level = ((Level - level_min)/(level_max - level_min))*(lc_max - lc_min) + lc_min
  ) %>%
  ggplot(aes(x = Time_Date, y = Level_Change, color = id)) +
  geom_point(size = 1) +
  # 改用缩放后的数值绘制折线,不会撑大主Y轴范围
  geom_line(aes(x=Time_Date, y = scaled_Level)) +
  scale_color_manual(values=c("red", "blue", "yellow", "green", "purple")) + 
  scale_x_datetime(breaks = scales::date_breaks("1 hour"), date_labels = "%H:%M") +
  scale_y_continuous(
    # 可自定义主Y轴范围,进一步放大Level_Change的展示效果,比如limits = c(0.3, 1)
    expand = c(0.05, 0.05),
    # 次轴用反向公式转换回Level的真实值显示
    sec.axis = sec_axis(
      ~ .*(first(Data$level_max) - first(Data$level_min))/(first(Data$lc_max) - first(Data$lc_min)) + first(Data$level_min),
      name = "MW-25 GW Level"
    )
  ) +
  labs(title = "MW-25 Pumping Test Monitoring Well Response",
       x = "",
       y = "Change in Water Level (ft.)",
       color = "Well ID") +
  theme_classic() +
  theme(legend.title = element_blank())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 17:15:04