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

ggplot2双Y轴配置问题:设置轴范围与解决缺失值报错

解决ggplot双Y轴绘图缺失值报错问题

报错原因

你遇到的Removed 8 rows containing missing values是因为ski的数值范围(245-4322)远大于左Y轴设置的0-50范围,ggplot会自动过滤掉超出轴限制的数据点,导致所有ski的数据都被判定为缺失,无法绘制线条。

解决方案

双Y轴的核心是将第二个变量缩放到左Y轴的范围内,再通过右侧轴的转换函数还原真实数值。具体步骤如下:

  • 计算缩放比例:右轴最大值5000 ÷ 左轴最大值50 = 100,因此需要将ski除以100来匹配左轴的数值范围
  • 调整geom_line中ski的Y轴映射为缩放后的值
  • 修改右侧辅助轴的转换公式,将缩放后的值还原为真实的ski数值,并设置右侧轴的刻度和范围

修正后的完整代码

my_data <- data.frame(
  th = c(1.2, 1.0, 0.8, 0.6, 0.4, 0.2, 0.1, 0.01),
  ob = c(40, 34, 15, 11, 11, 12, 13, 16),
  ski = c(3000, 2509, 1309, 1209, 4322, 1283, 383, 245)
)

library(ggplot2)

p <- ggplot(my_data, aes(x = th)) 
p <- p +
  scale_x_continuous(
    breaks = seq(0, 1.2, by = 0.2),
    limits = c(1.2, 0),
    trans = "reverse" 
  ) +
  scale_y_continuous(
    name = "ob",
    breaks = seq(0, 50, by = 10),
    limits = c(0, 50),
    # 右侧轴:将左轴缩放后的值乘以100还原为ski的真实值,设置刻度和范围
    sec.axis = sec_axis(~ . * 100, 
                        name = "ski",
                        breaks = seq(0, 5000, by = 1000),
                        limits = c(0, 5000))
  ) +
  geom_line(aes(y = ob), color = "red") +
  # 将ski除以100缩放到左轴0-50的范围内
  geom_line(aes(y = ski/100), color = "blue") +
  theme_minimal() # 可选:优化图表样式

print(p)

关键修改说明

  • geom_line(aes(y = ski/100)):把ski的数值缩小100倍,使其落在左Y轴0-50的范围内,避免数据被过滤
  • sec_axis(~ . * 100):将左轴的缩放值反向乘以100,让右侧轴显示ski的真实数值范围
  • 给右侧轴设置breaks = seq(0, 5000, by = 1000)和limits = c(0, 5000),确保刻度符合需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 16:01:14