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

如何在ggplot2中对齐并反转主次Y轴(水位与降雨可视化)

双Y轴图表配置:水位与降雨量的时间序列展示

问题需求

需在双Y轴时间图表中展示nivel(水位)和precip(降雨量)数据:

  • 主Y轴对应nivel:范围-1至5,轴反转
  • 次Y轴对应precip:范围0至600,轴反转
    目前仅主Y轴配置正常,无法正确设置次Y轴的变换与标签。

当前代码

## load data  
base_nivelprecip <- read_excel("C:/Users/frori/Documents/UFRGS/FAPERGS_SAQC/VNA/AnoHidro/REVISAO/DadosCompletos_PA.xlsx")

base_nivelprecip %>%
  mutate(nivel = as.double(nivel),
         precip = as.double(precip),
         precip_rescaled =  precip,
         nivel_rescaled =  - nivel + 5 ) %>% ## transform data
  ggplot(aes(x = data, y = nivel_rescaled,
             xmin = as.POSIXct("2012-05-01", "%Y-%m-%d"), 
             xmax = as.POSIXct("2020-04-30",  "%Y-%m-%d"))) + ## set variables and limits
  geom_col(aes(x = data, y = precip_rescaled), color = '#5F7161', fill = '#5F7161', size = 0.1) +
  geom_line(color = '#041562', size = 0.3) +
  labs(x = "", y = "Water level (m)") +
  scale_y_continuous(expand = c(0.001,0.001), 
                     labels = function(x) -x + 5,
                     limits = c(0, 6),
                     sec.axis = sec_axis(~.,
                                         name = "Rainfall (mm)")) +
  lemon::facet_rep_wrap(~poco, nrow = 4, repeat.tick.labels = 'all', scales = 'free') +
  theme_bw() +
  theme(text=element_text(size=12),
        axis.title.y = element_text(size = 10),
        axis.text.y = element_text(size = 8),
        axis.text.x = element_text(size = 8),
        panel.grid = element_blank())

数据样本

# A tibble: 5 × 4
        poco data                nivel              precip            
       <dbl> <dttm>              <chr>              <chr>              
1 4300020528 2014-05-02 00:00:00 2.2000000000000002 0                 
2 4300020528 2014-05-03 00:00:00 2.2200000000000002 0                 
3 4300020528 2014-05-04 00:00:00 2.2200000000000002 0                 
4 4300020528 2014-05-05 00:00:00 2.23               1.1000000000000001
5 4300020528 2014-05-06 00:00:00 2.2400000000000002 0  

解决方案

核心是将降雨量数据缩放到主Y轴刻度范围,同时在次Y轴还原标签并实现反转,修改后的代码如下:

## load data  
base_nivelprecip <- read_excel("C:/Users/frori/Documents/UFRGS/FAPERGS_SAQC/VNA/AnoHidro/REVISAO/DadosCompletos_PA.xlsx")

base_nivelprecip %>%
  mutate(nivel = as.double(nivel),
         precip = as.double(precip),
         # 将降雨量0-600缩放到主Y轴的0-6范围
         precip_rescaled = precip / 100,
         # 水位反转映射到0-6(对应原水位5到-1)
         nivel_rescaled = -nivel + 5) %>% 
  ggplot(aes(x = data)) +
  # 降雨量柱状图使用缩放后的值
  geom_col(aes(y = precip_rescaled), color = '#5F7161', fill = '#5F7161', size = 0.1) +
  # 水位线图使用缩放后的值
  geom_line(aes(y = nivel_rescaled), color = '#041562', size = 0.3) +
  labs(x = "", y = "Water level (m)") +
  scale_y_continuous(
    expand = c(0.001, 0.001),
    # 主Y轴标签还原为原水位值(反转显示)
    labels = function(x) -x + 5,
    limits = c(0, 6),
    sec.axis = sec_axis(
      # 次Y轴将缩放值还原为原降雨量
      ~ . * 100,
      name = "Rainfall (mm)",
      # 次Y轴标签反转(0→600,6→0)
      labels = function(x) 600 - x
    )
  ) +
  lemon::facet_rep_wrap(~poco, nrow = 4, repeat.tick.labels = 'all', scales = 'free') +
  theme_bw() +
  theme(
    text = element_text(size=12),
    axis.title.y = element_text(size = 10),
    axis.text.y = element_text(size = 8),
    axis.text.x = element_text(size = 8),
    panel.grid = element_blank()
  )

关键修改说明

  1. 降雨量缩放:precip_rescaled = precip / 100,将0-600的降雨量范围压缩到主Y轴的0-6区间,确保柱状图能在图表范围内正常显示。
  2. 次Y轴标签反转:通过labels = function(x) 600 - x,将次Y轴刻度值从0-600反转成600-0,实现轴反转的视觉效果。
  3. 次Y轴值还原:~ . * 100将缩放后的降雨量值还原为原始单位,保证标签显示的是真实降雨量数值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 07:45:30