我有一个数据集sales_history。这是前15行中的dput
sales_history <- structure(list(month = c("2008/01", "2008/02",
"2008/03", "2008/04", "2008/05", "2008/06", "2008/07",
"2008/08", "2008/09", "2008/10", "2008/11", "2008/12",
"2009/01", "2009/02", "2009/03"),
sales= c(941, 1275, 1908, 2152, 1556,
3052, 2627, 3244, 3817, 3580, 444,
3332, 2823, 3407, 4148 )),
.Names = c("month", "sales"),
row.names = c(NA, 15L),
class = "data.frame")
我从2008/01到2013/10都有几个月的时间。我使用以下方法对其进行了自动预测:
arimaforecast<-function(df)
{
ts1<- ts(df$sales, frequency=12, start=c(2008,1))
fit<-auto.arima(ts1,ic="bic")
plot1=plot(forecast(fit,h=20))
return(plot1)
}
arimaforecast(sales_history)
然后我想绘制时间序列。我写的如下。
y <- ts(sales_history$sales,freq=12,start=c(2011,1),end=c(2013,10))
yt <- window(y,end=c(2013,4))
yfit <- auto.arima(yt,ic="bic")
yfor <- forecast(yfit,h=10)
plot(yfor, main="sales Forecasting", sub="OPTIMAL ARIMA MODEL",
xlab="MONTH", ylab="sales")
lines(fitted(yfor),col="blue")
lines(y,col="red")
然后,图表变得非常丑陋。如何生成更好的图表以执行以下操作?
答案 0 :(得分:2)
我仍然不完全确定你对这些酒吧的意思,因为你的图表中没有绿线(仅蓝色和红色),但这里是一个结合了我认为你正在寻找的不同功能的情节对于。由于情节稍微复杂一点,而且我对forecast
提供的绘图函数不太熟悉,因此使用ggplot2
包来实现,这可以生成非常好的图形并提供很大的灵活性用于调整(有关详细文档,请参阅ggplo2)。
代码的第一部分从代码示例中获取预测对象yfor
,并将其转换为易于在ggplot
中使用的数据框(您可以使用Date对象改进此部分)如果你想在x轴标签上有更多的灵活性,而不是数字时标,第二部分绘制它(情节相当截止,因为这只是你的数据的一个子集,但同样适用于整个数据集)。
# convert forecast object into data frame
ts_values <- data.frame(
time = as.numeric(time(yfor$x)),
sales = as.numeric(yfor$x),
fit = as.numeric(yfor$fitted))
ts_forecast <- data.frame(
time = as.numeric(time(yfor$mean)),
fit = as.numeric(yfor$mean),
upper.80 = as.numeric(yfor$upper[,1]),
upper.95 = as.numeric(yfor$upper[,2]),
lower.80 = as.numeric(yfor$lower[,1]),
lower.95 = as.numeric(yfor$lower[,2]))
# combine fitted data and forecast mean
ts_values <- rbind(ts_values, transform(ts_forecast[c("time", "fit")], sales = NA))
# plot it all
library(ggplot2)
ggplot(NULL, aes(x = time)) +
geom_bar(data = ts_values, aes(y = sales), stat = "identity",
fill = "dark green", position="dodge") +
geom_line(data = ts_values, aes(y = fit), colour = "red", size = 2) +
geom_ribbon(data = ts_forecast, aes(ymin = lower.95, ymax = upper.95),
alpha=.2, fill="red") +
geom_ribbon(data = ts_forecast, aes(ymin = lower.80, ymax = upper.80),
alpha=.2, fill="red") +
scale_y_continuous(labels = function(x) paste(x/10^6, "M"), expand = c(0,0)) +
theme_bw()