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

使用ggh4x的help_secondary结合geom_col时次轴异常及图例需求

解决ggh4x次轴柱形显示异常与图例添加问题

问题分析

原代码存在两个核心问题:

  1. help_secondary默认投影逻辑将降雨量0映射到主轴范围外,导致对应柱形显示为负数(-500),需隐藏;
  2. 手动指定颜色未绑定到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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 23:25:36