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
相关产品推荐
相关产品推荐

