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

如何用ggplot清晰绘制含负值数据?解决缩放后无自动图例问题

问题解决方案

一、解决双变量可视化被掩盖的问题

因为pre和tmp的数值范围差异极大(pre区间约为-19.6629.48,`tmp`区间约为-1.182.05),直接同轴绘制会压缩tmp的显示空间,推荐以下三种解决方案:

1. 使用双Y轴

通过sec_axis添加右侧Y轴,分别对应两个变量的原始数值,保留各自刻度范围:

library(ggplot2)

# 计算tmp到pre的转换系数,用于对齐双轴比例
coef <- max(df$pre, na.rm = T) / max(df$tmp, na.rm = T)

ggplot(df) +
  geom_line(aes(x = year, y = pre), color = "blue") +
  geom_line(aes(x = year, y = tmp * coef), color = "red") +
  scale_y_continuous(
    name = "pre",
    sec.axis = sec_axis(~ . / coef, name = "tmp")
  ) +
  labs(x = "年份") +
  theme_minimal()

2. 分面绘图

将两个变量分开绘制,各自保留原始刻度,直观对比趋势:

library(tidyr)
library(ggplot2)

# 转换为长格式数据
df_long <- pivot_longer(df, cols = c(pre, tmp), names_to = "variable", values_to = "value")

ggplot(df_long, aes(x = year, y = value, color = variable)) +
  geom_line() +
  facet_wrap(~variable, scales = "free_y") +
  labs(x = "年份", y = "数值") +
  theme_minimal()

3. 数据标准化

将两个变量标准化到同一区间(均值0,标准差1),同轴对比相对变化趋势,该方案可结合下文的图例解决方法实现。


二、解决缩放后无法生成图例的问题

你当前代码直接在geom_line外指定col,未将颜色与变量建立映射关系,导致ggplot无法生成图例。正确做法是先将数据转为长格式,再在aes内映射颜色:

library(tidyr)
library(ggplot2)

# 转换为长格式并标准化数值
df_long_scale <- df %>%
  pivot_longer(cols = c(pre, tmp), names_to = "variable", values_to = "value") %>%
  group_by(variable) %>%
  mutate(scaled_value = scale(value)) %>%
  ungroup()

ggplot(df_long_scale, aes(x = year, y = scaled_value, color = variable)) +
  geom_line() +
  geom_text(aes(label = year), size = 3, vjust = -1) + # 统一添加年份标签,简化代码
  scale_x_continuous(breaks = 2001:2020, name = NULL) +
  scale_y_continuous(name = NULL) +
  scale_color_manual(values = c("pre" = "blue", "tmp" = "red")) + # 自定义颜色匹配需求
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) # 旋转X轴标签避免重叠

关键说明:

  • 用pivot_longer将宽格式转为长格式,生成variable列区分pre和tmp,这是ggplot实现映射和图例的基础。
  • 标准化操作放在数据预处理阶段,代码更清晰易维护。
  • 将color = variable放入aes内,ggplot会自动生成图例,再通过scale_color_manual自定义颜色。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:31:01