使用预测对象的自动绘图功能自动绘图

Automatically plots with autoplot function from forecasting object

我正在结合 fpp2 包中的数据集和 forecast 包中的预测功能进行造林。此预测的输出是带有 SNAIVE_MODELS_ALL 的对象列表。该对象包含两个系列的数据,第一个是电力,第二个是水泥。 你可以看到下面的代码:

#  CODE
library(fpp2)
library(dplyr)
library(forecast)
library(gridExtra)
library(ggplot2)

#INPUT DATA
mydata_qauselec <- qauselec
mydata_qcement <- window(qcement, start = 1956, end = c(2010, 2))

# Мerging data
mydata <- cbind(mydata_qauselec, mydata_qcement)
colnames(mydata) <- c("Electricity", "Cement")

# Test Extract Name
mydata1 <- data.frame(mydata)
COL_NAMES <- names(mydata1)
rm(mydata_qauselec, mydata_qcement)

# FORCASTING HORIZON
forecast_horizon <- 12

#FORCASTING
BuildForecast <- function(Z, hrz = forecast_horizon) {
  timeseries <- msts(Z, start = 1956, seasonal.periods = 4)
  forecast <- snaive(timeseries, biasadj = TRUE, h =  hrz)
}  

frc_list <- lapply(X = mydata1, BuildForecast)

#FINAL FORCASTING
SNAIVE_MODELS_ALL<-lapply(frc_list,  forecast)

所以我的目的是将这个对象 SNAIVE_MODELS_ALL 放入自动绘图函数中,以获得如下图所示的两个图。

使用下面的代码,我将两个图分开绘制,但我的主要目的是使用函数 autoplot 和一些函数(如 apply 或类似的东西)来完成此操作,它可以自动绘制这两个图表,如 pic above.This 只是真实示例中的小示例我可能会有 5 或 10 个图表。

#PLOT 1
P_PLOT1<-autoplot(SNAIVE_Electricity,main = "Snaive Electricity forecast",xlab = "Year", ylab = "in billion kWh")+
  autolayer(SNAIVE_Electricity,series="Data")+
  autolayer(SNAIVE_Electricity$fitted,series="Forecasts")

# PLOT 2
P_PLOT2<-autoplot(SNAIVE_Cement,main = "Snaive Cement forecast",xlab = "Year", ylab = "in millions of tonnes")+
  autolayer(SNAIVE_Cement,series="Data")+
  autolayer(SNAIVE_Cement$fitted,series="Forecasts")

#UNION PLOTS (PLOT 1 AND PLOT 2)
SNAIVE_PLOT_ALL<-grid.arrange(P_PLOT1,P_PLOT2)

有人可以帮我处理这段代码吗?

如果我以正确的方式理解,这个问题的难点之一是每个图都应该有一个特定的标题和 y 标签。一种可能的解决方案是将绘图标题和 y-lables 设置为函数参数:

PlotForecast <- function(df_pl, main_pl, ylab_plt){
    autoplot(df_pl,
    main = main_pl,
    xlab = "Year", ylab = ylab_plt)+
    autolayer(df_pl,series="Data")+
    autolayer(df_pl$fitted,series="Forecasts")
}

准备要与 PlotForecast() 一起使用的绘图标签列表:

main_lst <- list("Snaive Electricity forecast", "Snaive Cement forecast")
ylab_lst <- list("in billion kWh", "in millions of tonnes")

使用基本 Map() 函数构建 plot-objects 的列表:

PL_list <- Map(PlotForecast, df_pl = SNAIVE_MODELS_ALL, main_pl = main_lst,
    ylab_plt= ylab_lst)

然后我们所要做的就是用剧情列表调用grid.arrange()

do.call(grid.arrange, PL_list)

请注意,main_lstylab_lst 是出于演示目的手动创建的,但如果您使用大量图表,这不是最佳方法。理想情况下,应使用原始 SNAIVE_PLOT_ALL 列表自动生成标签。