Функция автоплота ведет себя по-другому, когда я загружаю ggfortify

Я хочу построить графики для различных моделей прогнозов.

Когда я использую автоплот после загрузки 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

Ссылаясь на комментарии и ответы на этот вопрос, я также загрузил пакет ggfortify.

прогноз v7 и графика ggplot2 добавление подогнанной линии к автоплоту

После этого код работает нормально, и подходящие линии для обучающих и тестовых данных отображаются идеально. Однако заштрихованная область, которая раньше была синей (темная и светлая для Lo 80, Hi 80, Lo 95 и Hi 95), полностью стала серой, как на графике ниже:

введите здесь описание изображения

Я хочу, чтобы заштрихованная область выглядела так, как на первом графике.


person Aneesh    schedule 24.04.2018    source источник


Ответы (1)


В вашем коде есть несколько проблем.

Первый график строится с использованием

forecast:::autoplot.forecast

autplot метод для forecast объектов из пакета forecast

при загрузке 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. Ни в формате, удобном для преобразования в длинный, но в управляемом:

Пример без преобразования в длинный формат (еретический способ 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)

введите описание изображения здесь

person missuse    schedule 24.04.2018
comment
Спасибо. Я думал, что метод переопределяется, но просто не мог разобраться. Однако метод ggplot решил всю проблему. Кроме того, как вы сказали, это позволяет мне настраивать график в соответствии с моими потребностями. - person Aneesh; 25.04.2018