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

R Studio双Y轴绘图:仅反转降水轴保留水深轴的实现问题

解决ggplot双Y轴单独反转其中一个轴的问题

要实现降水Y轴反转(从上到下)、水深Y轴保持正常的双Y轴图,核心问题是ggplot的双Y轴共享同一个数值空间,直接用scale_y_reverse()会同时反转两个轴。正确的做法是手动调整数据映射,让降水数据在负半轴、水深在正半轴,再通过刻度标签处理实现视觉上的轴方向差异。

修正后的代码

library(ggplot2)

# 预处理数据范围,避免图形截断
max_precip <- max(BeachSensors$Precip, na.rm = TRUE)
max_depth <- max(BeachSensors$CorrDepth, na.rm = TRUE)
depth_scale_factor <- 2 # 对应你原代码中的转换系数

ggplot(BeachSensors) +
  # 降水柱状图:取反数据实现从顶部向下延伸
  geom_bar(aes(x = Date, y = -Precip), 
           stat = "identity", fill = "cyan", colour = "#006000") +
  # 水深折线图:按比例缩放数据匹配主Y轴空间
  geom_line(aes(x = Date, y = CorrDepth / depth_scale_factor, color = Sensor), 
            stat = "identity", size = 1) +
  # 配置双Y轴
  scale_y_continuous(
    name = "Precipitation (in.)",
    # 设置坐标轴范围,覆盖降水负数值和缩放后水深值
    limits = c(-max_precip, max_depth / depth_scale_factor),
    # 自定义刻度标签:负数值转绝对值(降水),正数值还原为实际水深
    labels = function(x) {
      ifelse(x < 0, abs(x), x * depth_scale_factor)
    },
    # 次Y轴:还原水深实际值
    sec.axis = sec_axis(~ . * depth_scale_factor, name = "Depth (ft.)")
  ) +
  labs(title = "GLSM Precipitation and Depth", x = "Date") +
  theme_minimal()

关键步骤说明

  1. 反转降水数据:将Precip取反(y = -Precip),让柱状图从Y轴0点向下绘制,视觉上呈现“数值从顶部向下增大”的效果。
  2. 缩放水深数据:将CorrDepth除以转换系数(这里是2),让水深数据适配主Y轴的数值空间,避免和降水数据重叠。
  3. 自定义刻度标签:通过labels函数把负刻度转为绝对值(显示降水实际值),正刻度乘以系数还原为水深实际值。
  4. 次Y轴配置:用sec_axis将主Y轴的正数值转换回水深实际值,保持次轴方向正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 02:56:52