在R语言ggplot2中为绘图添加双Y轴的问题求助
R双Y轴数据映射修复方案
要解决你提到的四个数据系列错误显示在左侧Y轴的问题,核心是利用数据缩放+辅助轴转换的逻辑(以下以最常用的ggplot2为例,base R思路类似):
关键逻辑
右侧Y轴范围是0-400,左侧是0-40,两者比例为10:1。你需要先把右侧四个系列的数值除以10,让它们适配左侧轴的范围,再通过sec_axis把辅助轴的刻度转换回原始的0-400范围,这样就能实现数据到右侧轴的正确映射。
示例代码(可直接适配你的数据)
library(ggplot2) # 替换成你的实际数据框 your_data <- data.frame( # 假设你的X轴是时间或类别变量 X_var = c("8:00", "9:00", "10:00", "11:00"), # 左侧Y轴的变量(0-40范围) Left_Series1 = c(5, 12, 28, 35), Left_Series2 = c(3, 15, 22, 38), # 需要放到右侧Y轴的四个系列(0-400范围) Cars_Avg_Sunday = c(50, 120, 280, 350), Cars_Carfree_sunday = c(30, 150, 220, 380), Active_AvgSunday = c(40, 130, 260, 330), Active_CarfreeSunday = c(60, 110, 290, 360) ) ggplot(your_data, aes(x = X_var)) + # 绘制左侧Y轴的系列(正常映射) geom_line(aes(y = Left_Series1, color = "左侧系列1"), group = 1) + geom_line(aes(y = Left_Series2, color = "左侧系列2"), group = 1) + # 绘制右侧Y轴的四个系列:数值除以10适配左侧轴范围 geom_line(aes(y = Cars_Avg_Sunday / 10, color = "Cars_Avg_Sunday"), group = 1) + geom_line(aes(y = Cars_Carfree_sunday / 10, color = "Cars_Carfree_sunday"), group = 1) + geom_line(aes(y = Active_AvgSunday / 10, color = "Active_AvgSunday"), group = 1) + geom_line(aes(y = Active_CarfreeSunday / 10, color = "Active_CarfreeSunday"), group = 1) + # 设置Y轴:左侧范围0-40,右侧辅助轴转换回0-400 scale_y_continuous( name = "左侧Y轴(0-40)", limits = c(0, 40), sec.axis = sec_axis( trans = ~ . * 10, # 反转缩放,把刻度转成0-400 name = "右侧Y轴(0-400)", limits = c(0, 400) ) ) + # 自定义颜色区分系列 scale_color_manual( values = c( "左侧系列1" = "#2c3e50", "左侧系列2" = "#e74c3c", "Cars_Avg_Sunday" = "#3498db", "Cars_Carfree_sunday" = "#9b59b6", "Active_AvgSunday" = "#2ecc71", "Active_CarfreeSunday" = "#f39c12" ) ) + labs(x = "时间", color = "数据系列") + theme_minimal()
注意事项
- 所有需要映射到右侧轴的系列,必须在
aes(y = ...)中对数值进行缩放(这里是/10),否则会默认使用左侧轴范围。 - 如果你的左侧轴不是从0开始,缩放比例需要调整为
(右侧最大值 - 右侧最小值)/(左侧最大值 - 左侧最小值),再用这个比例对右侧数据进行缩放。 - 若使用base R绘图,可通过
par(new = TRUE)创建新绘图区域,设置axis(4)来添加右侧轴,同时手动调整右侧数据的y范围适配左侧绘图区域。
内容的提问来源于stack exchange,提问作者bram
相关产品推荐
相关产品推荐

