如何在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() )
关键修改说明
- 降雨量缩放:
precip_rescaled = precip / 100,将0-600的降雨量范围压缩到主Y轴的0-6区间,确保柱状图能在图表范围内正常显示。 - 次Y轴标签反转:通过
labels = function(x) 600 - x,将次Y轴刻度值从0-600反转成600-0,实现轴反转的视觉效果。 - 次Y轴值还原:
~ . * 100将缩放后的降雨量值还原为原始单位,保证标签显示的是真实降雨量数值。
内容的提问来源于stack exchange,提问作者fernando schuh
相关产品推荐
相关产品推荐

