编辑时间序列图

时间:2014-06-02 20:08:35

标签: r plot time-series

我有一个数据集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")

然后,图表变得非常丑陋。如何生成更好的图表以执行以下操作?

  1. y轴不显示为1e + 06,3e + 06,而是1M,3M等等。
  2. 使用绿色直方图(即条形图)来显示历史销售数据,同时仍然使用线条(带有连接的点)来显示拟合的历史记录和预测?

1 个答案:

答案 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()

enter image description here