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

R中时间序列绘图问题:ggseasonalplot与autoplot异常排查

时间序列绘图问题及解决

数据情况

拥有2025年1月1日至2月28日的日时间序列数据,特征为:

  • 工作日数值高,周六、周日数值低;
  • 每月前两周工作日数值高于后两周。

遇到的问题

  1. ggseasonalplot生成的季节性图显示周四数值最低,但实际应为周日;
  2. autoplot绘制的图中x轴不显示实际日期(直接用ggplot可正常显示)。

原始代码

library(forecast)

dates <- seq(as.Date("2025-01-01"), as.Date("2025-02-28"), by = 1)
residual <- c(1272265118, 1893878984, 1971248967, 1206920994, 1071775081, 2113202354,
              2096828782,2156692644, 2066645508, 2104943137, 1482914237,  635563876, 
              1553731395,  985106749,1234648105, 1222932743, 1266615010,  552150792,
              212894667, 1122524796, 1148910414,
              1087774137, 1019459908, 1046319082,  586277591,  153830967,  994011343,
              1016875440,
              1015254239, 1011042302, 1104754682,608339645,  692436369, 1860344171,
              1987819504,
              2157579522, 2091920934, 1993873640, 1580583560, 1026390430, 
              2196973517, 1853411958,
              1735132015, 1490268789, 1345789623,  720690501,  326810024,
              1244604895, 1210696838,
              1493402864, 1126684981,1093146463,  613249936,  198156734, 1067010013,
              1044503832,
              1209633127, 1080260309, 1159072875)
data <- data.frame(dates,residual)
ts_data <- ts(data$residual, start = as.Date("2025-01-01"), frequency = 7)
autoplot(ts_data)
ggseasonalplot(ts_data) 

问题1:ggseasonalplot星期标签错位的解决

原因

ts对象的start参数传入日期格式会被自动转换为数值,导致frequency=7的周周期起始错位;同时ggseasonalplot默认从数据第一天(2025-01-01,周三)开始排列星期顺序,而非自然的星期顺序,最终标签和实际星期不匹配。

解决方法

方法1:基于原始数据框手动绘制(更直观)

用lubridate提取星期并设置有序因子,确保标签和实际星期对应:

library(ggplot2)
library(lubridate)

# 提取星期几并转为有序因子(按自然顺序排列)
data$weekday <- wday(data$dates, label = TRUE, abbr = FALSE)
data$weekday <- factor(data$weekday, levels = c("星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"))

# 绘制按星期分组的分布
ggplot(data, aes(x = weekday, y = residual)) +
  geom_boxplot() +
  labs(x = "星期", y = "数值", title = "按星期分组的数值分布") +
  theme_minimal()

方法2:修改ggseasonalplot的标签

如果坚持用ggseasonalplot,手动替换x轴标签为正确的星期:

# 匹配数据起始日(周三)的星期顺序
correct_labels <- c("星期三", "星期四", "星期五", "星期六", "星期日", "星期一", "星期二")
ggseasonalplot(ts_data) +
  scale_x_discrete(labels = correct_labels) +
  labs(x = "星期")

问题2:autoplot显示实际日期的解决

原因

ts对象仅存储数值索引,不保留日期信息,因此autoplot默认显示索引值而非实际日期。

解决方法

方法1:直接用ggplot绘制

基于原始带日期的数据框绘图,可自由控制日期显示格式:

ggplot(data, aes(x = dates, y = residual)) +
  geom_line() +
  scale_x_date(date_labels = "%Y-%m-%d", date_breaks = "1 week") +
  labs(x = "日期", y = "数值", title = "时间序列趋势") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

方法2:转换为tsibble对象后用autoplot

tsibble支持带日期索引的时间序列,兼容autoplot:

library(tsibble)

# 转换为带日期索引的tsibble对象
tsib_data <- as_tsibble(data, index = dates)
# 绘图并设置日期显示
autoplot(tsib_data, residual) +
  scale_x_date(date_labels = "%Y-%m-%d", date_breaks = "1 week") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 20:28:11