R语言中如何实现跨年份移动平均线的叠加对比可视化?
解决方案:叠加年度移动平均线至单一年度时间轴
核心思路
通过虚拟年度日期映射将不同年份的数据对齐到同一时间轴,同时利用geom_ma的分组计算特性,按年份独立生成移动平均线,既保留geom_ma的便捷性,又能直观对比年度间的季节性与趋势差异。
步骤1:数据准备与日期转换
首先生成含季节性、趋势和噪声的模拟销售数据,关键是将所有年份的日期映射到同一虚拟年度(比如2020年,覆盖所有日期),确保x轴统一为1月1日至12月31日。
library(tidyverse) library(tidyquant) library(lubridate) # 生成2018-2022年每日销售数据 sales_data <- tq_sequence( from = ymd("2018-01-01"), to = ymd("2022-12-31"), by = "day" ) %>% rename(date = x) %>% mutate( seasonality = 50 * sin(2 * pi * yday(date) / 365), # 年度季节性波动 trend = 0.02 * row_number(), # 线性增长趋势 noise = rnorm(n(), mean = 0, sd = 10), # 随机噪声 sales = 100 + seasonality + trend + noise, # 最终销售额 year = factor(year(date)), # 提取年份用于分组 # 生成虚拟日期:所有年份映射到2020年,仅保留月/日信息 dummy_date = make_date(year = 2020, month = month(date), day = day(date)) )
步骤2:可视化实现(保留geom_ma便捷性)
通过color = year自动按年份分组,geom_ma会对每个年份的独立数据计算移动平均线,避免跨年份的边界问题,同时直接生成年度对比图。
ggplot(sales_data, aes(x = dummy_date, y = sales, color = year)) + # 可选:添加低透明度原始数据点作为背景 geom_point(alpha = 0.2, size = 0.5) + # 按年份分组计算14日简单移动平均线 geom_ma(ma_fun = SMA, n = 14, linewidth = 1) + # 优化x轴显示:仅展示月份标签 scale_x_date(date_labels = "%b", date_breaks = "1 month") + # 使用tidyquant配色方案区分年份 scale_color_tq() + # 添加图表标签 labs( x = "日期", y = "销售额", color = "年份", title = "各年度14日移动平均线对比", subtitle = "叠加至单一年度轴,快速识别季节性与趋势变化" ) + theme_tq()
关键说明
- 虚拟日期的作用:
dummy_date将不同年份的同月同日对齐,消除年份差异,聚焦年度内的走势对比。 - 分组计算均线:
geom_ma会基于每个年份的独立数据集计算均线,无需提前手动处理边界值,完全保留其便捷性。 - 可视化优化:低透明度原始点提供数据背景,加粗的均线突出核心趋势,颜色编码清晰区分不同年份的变化。
内容的提问来源于stack exchange,提问作者Hugues
相关产品推荐
相关产品推荐

