RStudio中如何绘制双Y轴同图展示不同量级的销售额与温度序列
R双Y轴绘制两个量级差异的时间序列方案
实现思路
由于销售额和温度数值量级差异大,无法直接在同一Y轴展示,因此通过数值缩放+次Y轴映射的方式实现:
- 先将xts格式的时间序列转换为ggplot可直接处理的结构化数据框
- 计算两个变量的范围比值作为缩放系数,将温度变量缩放至与销售额量级匹配
- 绘图时将两个变量分别映射到主、次Y轴,次Y轴通过反向缩放还原温度的真实数值
完整实现代码
首先加载依赖包:
library(ggplot2) library(dplyr) library(ggfortify)
数据处理与绘图:
# 将xts对象转换为带日期列的数据框 df <- fortify(data_tmp) %>% select(date = Index, sales, temperature) # 计算缩放系数:用两个变量的极差比值计算,适配含负值的场景 scale_factor <- diff(range(df$sales, na.rm = TRUE)) / diff(range(df$temperature, na.rm = TRUE)) # 绘制双Y轴时序图 ggplot(df, aes(x = date)) + # 绘制销售额曲线,映射左侧主Y轴 geom_line(aes(y = sales, color = "销售额"), linewidth = 1) + # 绘制温度曲线,乘以缩放系数后适配主Y轴范围 geom_line(aes(y = temperature * scale_factor, color = "温度"), linewidth = 1) + # 配置双Y轴:右侧次Y轴反向除以缩放系数还原温度真实值 scale_y_continuous( name = "销售额", sec.axis = sec_axis(~. / scale_factor, name = "温度") ) + # 自定义两个变量的配色 scale_color_manual(values = c("销售额" = "#1f77b4", "温度" = "#ff7f0e")) + # 优化图表标签与主题 labs(x = "日期", color = "指标类型") + theme_bw() + # 左右Y轴标题和对应曲线配色一致,可读性更强 theme( axis.title.y.left = element_text(color = "#1f77b4"), axis.title.y.right = element_text(color = "#ff7f0e") )
调优提示
- 如果两个序列的重叠度过高影响观察,可以在计算缩放系数时额外乘以0.8/1.2的调整系数,拉开两个序列的展示位置
- 若需要保留autoplot的风格,也可直接用
autoplot(data_tmp, facets = FALSE)+ 次Y轴配置,但灵活度低于直接用ggplot自定义
内容的提问来源于stack exchange,提问作者Jusep
相关产品推荐
相关产品推荐

