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

