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

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()

关键说明

  1. 虚拟日期的作用:dummy_date将不同年份的同月同日对齐,消除年份差异,聚焦年度内的走势对比。
  2. 分组计算均线:geom_ma会基于每个年份的独立数据集计算均线,无需提前手动处理边界值,完全保留其便捷性。
  3. 可视化优化:低透明度原始点提供数据背景,加粗的均线突出核心趋势,颜色编码清晰区分不同年份的变化。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 15:07:53