如何用autoplot()生成一致的R分解时间序列可视化图
问题
我写的R脚本有时生成一种分解时间序列图,有时却是另一种,完全随机。我想要标题为“Decomposition of additive time series.”的图,但现在不管指定ggplot2::autoplot()还是forecast::autoplot(),出来的都是我不想要的那种。
附上脚本代码:
library(pacman) p_load(tidyverse, janitor, lubridate, forecast) # 导入数据 df <- clean_names(read_csv("data.csv")) %>% mutate(date = mdy(date)) %>% select(-dpb) # 生成月度汇总数据 df_monthly <- df %>% mutate(month = floor_date(date, unit = "month")) %>% group_by(month) %>% summarise(bbl = sum(bbl), rev = sum(rev)) %>% mutate(dpb = rev/bbl) %>% select(month, dpb) # 时间序列分解 t <- ts(data = df_monthly[,-1], start = c(2014, 1, 1), frequency = 12) d <- decompose(t, type = "additive") # 绘制分解图 p <- autoplot(d) print(p)
- 不想要的图:子图分散排列,无统一标题,每个子图单独标注
- 想要的图:带有统一标题“Decomposition of additive time series.”,子图按原始序列、趋势、季节、残差紧凑排列
解决方法
核心原因
问题根源是不同R包对decompose()返回的decomposed.ts对象的autoplot方法优先级冲突:
forecast包的autoplot.decomposed.ts会生成你想要的带统一标题的紧凑图ggplot2或fpp2(如果被间接加载)的同名方法会生成分散的无统一标题的图- 脚本里
p_load(tidyverse)会自动加载ggplot2,而forecast的方法可能被覆盖;或者包的加载顺序随机,导致方法优先级变化,所以图的样式会随机切换
具体解决步骤
强制调用
forecast包的autoplot方法
别直接写autoplot(d),改成:p <- forecast::autoplot(d)要是之前这么写没用,大概率是因为你环境里装了
fpp2包——它也定义了autoplot.decomposed.ts,且优先级更高。卸载冲突的
fpp2包
执行以下命令清理环境:detach("package:fpp2", unload = TRUE)之后再调用
forecast::autoplot(d)就能得到你想要的图。固定包的加载顺序
把forecast包放在最后加载,确保它的方法覆盖其他包的同名方法:library(pacman) p_load(tidyverse, janitor, lubridate) p_load(forecast) # 最后加载forecast验证当前生效的方法
用以下命令查看哪个包的autoplot在处理decomposed.ts对象:methods(autoplot) getS3method("autoplot", "decomposed.ts")如果输出显示来自
forecast包,说明配置正确。
内容的提问来源于stack exchange,提问作者dyork423
相关产品推荐
相关产品推荐

