R中时间序列绘图问题:ggseasonalplot与autoplot异常排查
时间序列绘图问题及解决
数据情况
拥有2025年1月1日至2月28日的日时间序列数据,特征为:
- 工作日数值高,周六、周日数值低;
- 每月前两周工作日数值高于后两周。
遇到的问题
ggseasonalplot生成的季节性图显示周四数值最低,但实际应为周日;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
相关产品推荐
相关产品推荐

