【问题标题】:Autoplot function behaves differently when I load ggfortify当我加载 ggfortify 时,Autoplot 函数的行为不同
【发布时间】:2018-04-24 06:13:49
【问题描述】:

我想为各种预测模型绘制图表。

当我在加载 ggplot2 后使用自动绘图时,绘图显示如下:

autoplot(m_hw1_ff)

我还想为训练和测试数据添加拟合线。为此,我使用以下代码:

autoplot(m_hw1_ff) + 
  geom_line(aes(y=m_reg1_ff$fitted), col = "green") +
  geom_line(data=test_ts_data, aes(y=test_ts_data), col = "red")

上面的代码在刚加载ggplot2后运行,会报如下错误:

Error in order(data$PANEL, data$group, data$x) : 
  argument 3 is not a vector

在参考了这个问题的cmets和答案后,我也加载了ggfortify包。

forecast v7 & ggplot2 graphics adding fitted line to autoplot

此后代码运行良好,训练和测试数据的拟合线完美绘制。然而,之前为蓝色的阴影区域(Lo 80、Hi 80、Lo 95 和 Hi 95 的深色和浅色)已完全变为灰色,如下图所示:

我希望阴影区域显示为第一张图中的样子。

【问题讨论】:

    标签: r ggplot2 forecasting ggfortify


    【解决方案1】:

    您的代码有几个问题。

    第一个情节是使用绘制的

    forecast:::autoplot.forecast
    

    forecastforecast 中的对象的 autplot 方法

    当您加载 ggforitify 时,它会被以下内容掩盖:

    ggfortify:::autoplot.forecast
    

    这就是情节表现不同的原因。

    我的建议是将预测对象转换为数据框并使用 ggplot 绘图。这将允许更高级别的定制。示例:

    library(forecast)
    library(ggfortify)
    
    d.arima <- auto.arima(AirPassengers)
    d.forecast <- forecast(d.arima,  h = 50)
    

    创建用于绘图的数据框:

    for_plot <- ggfortify:::fortify.forecast(d.forecast,
                                             ts.connect = TRUE)
    

    你也可以这样做:

     for_plot <- fortify(d.forecast, 
                         ts.connect = TRUE)
    

    加载ggfortify 后。

    我只是按照上面写的,所以你会明白什么叫做。

    for_plot 对象是一个数据框,不是 ggplot 喜欢的长格式。也不是对转换为 long 友好的格式,但它是易于管理的:

    未转换为长格式的示例(ggplot 异端方式):

    ggplot(data = for_plot) +
      geom_line(aes(x= Index, y = Data, color = "raw")) +
      geom_line(aes(x= Index, y = Fitted, color = "fitted")) +
      geom_line(aes(x= Index, y = `Point Forecast`, color = "point forecast")) +
      geom_ribbon(aes(x= Index, ymin = `Lo 80`, ymax = `Hi 80`,  fill = "80"),  alpha = 0.2) +
      geom_ribbon(aes(x= Index, ymin = `Lo 95`, ymax = `Hi 95`,  fill = "95"),  alpha = 0.2) +
      scale_fill_manual("what", values = c("blue", "dodgerblue"))+
      scale_color_manual("why", values = c("blue", "red", "green"))
    

    ggplot 方法包括将数据吐出到两个数据帧中,一个用于绘制功能区,另一个用于绘制线条,将每个数据转换为长格式,然后进行绘图。像这样的:

    library(tidyverse)
    
    for_plot_lines <- for_plot %>%
      gather(key, value, 2:4) %>%
      select(key, value, Index)
    
    for_plot %>%
      filter(!is.na(`Point Forecast`)) %>%
      gather(Lo, ymin, c("Lo 80", "Lo 95")) %>%
      gather(Hi, ymax, c("Hi 80", "Hi 95")) -> for_plot_ribbon
    
    ggplot(data = for_plot_lines) +
      geom_line(aes(x= Index, y = value, color = key)) +
      geom_ribbon(data = for_plot_ribbon,
                  aes(x= Index, ymin = ymin, ymax = ymax, fill = Hi), alpha = 0.2)
    

    【讨论】:

    • 谢谢。我认为该方法已被覆盖,但无法解决。然而,ggplot 方法解决了所有问题。此外,正如您所说,它让我可以根据需要自定义图表。
    猜你喜欢
    • 2017-04-24
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    • 2019-07-31
    • 2021-12-23
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多