使用ggh4x的help_secondary结合geom_col时次轴异常及图例需求
解决ggh4x次轴柱形显示异常与图例添加问题
问题分析
原代码存在两个核心问题:
help_secondary默认投影逻辑将降雨量0映射到主轴范围外,导致对应柱形显示为负数(-500),需隐藏;- 手动指定颜色未绑定到
aes()中,无法自动生成图例。
修改后完整代码
library(tidyverse) library(ggh4x) library(scales) # 生成次轴映射规则 sec <- help_secondary(df, primary = c(Tmax, Tmin, RH), secondary = Rainfall) ggplot(df, aes(x = Date)) + # 仅绘制降雨量>0的柱形,避免0值显示负数柱形 geom_col(aes(y = sec$proj(Rainfall), fill = "降雨量"), data = filter(df, Rainfall > 0)) + # 将线条颜色映射到aes,用于生成图例 geom_line(aes(y = Tmax, color = "最高温")) + geom_line(aes(y = Tmin, color = "最低温")) + geom_line(aes(y = RH, color = "相对湿度")) + # 设置主/次轴,可选限制主轴范围优化映射 scale_y_continuous(sec.axis = sec, limits = c(min(df$Tmin, df$RH), max(df$Tmax, df$RH))) + # 手动指定线条颜色与图例标签 scale_color_manual(values = c("最高温" = "red", "最低温" = "green", "相对湿度" = "black")) + # 手动指定柱形填充色与图例标签 scale_fill_manual(values = c("降雨量" = "blue")) + # 设置坐标轴与图例标题 ylab("温度、相对湿度") + labs(color = "气象指标", fill = "降雨量") + theme_minimal()
关键修改说明
1. 隐藏0降雨量的柱形
- 直接过滤法:给
geom_col传递data = filter(df, Rainfall > 0),仅绘制有降雨量的柱形,彻底规避0值问题; - NA赋值法:若需保留x轴所有刻度,可将y值设为
y = ifelse(Rainfall == 0, NA, sec$proj(Rainfall)),NA值不会被ggplot绘制; - 主轴范围优化:在
scale_y_continuous中设置limits,将主轴范围限定在主变量(温度、湿度)的区间内,减少次轴映射到负数的概率。
2. 添加图例
- 将颜色/填充标签移入
aes()内部(如color = "最高温"),让ggplot识别为图例项; - 用
scale_color_manual和scale_fill_manual分别定义线条、柱形的颜色与对应标签; - 通过
labs()统一设置图例标题,让多个图例的展示更协调。
内容的提问来源于stack exchange,提问作者UseR10085
相关产品推荐
相关产品推荐

