Как добавить geom_point() в строку autolayer()?

Попытка добавить geom_points в строку autolayer() («подогнана» на рис.), которая является оболочкой часть autoplot() для ggplot2 в пакете прогнозов Rob Hyndmans (в ggplot2 также есть базовый autoplot/autolayer, так что то же самое, вероятно, применимо и там).

Проблема в том, что (я не эксперт по ggplot2, а оболочка автографа усложняет задачу) geom_point() отлично подходит для основного вызова, но как мне применить аналог автослоя (подходящие значения)?

Пробовал type="b" как обычный geom_line(), но это не параметр объекта в autolayer().

require(fpp2)

model.ses <- ets(mdeaths, model="ANN", alpha=0.4)
model.ses.fc <- forecast(model.ses, h=5)

forecast::autoplot(mdeaths) +
  forecast::autolayer(model.ses.fc$fitted, series="Fitted") + # cannot set to show points, and type="b" not allowed
  geom_point() # this works fine against the main autoplot call

Подогнанная линия нуждается в точках


person TickboxPhil    schedule 13.04.2019    source источник


Ответы (1)


Кажется, это работает:

library(forecast)
library(fpp2)

model.ses <- ets(mdeaths, model="ANN", alpha=0.4)
model.ses.fc <- forecast(model.ses, h=5)

# Pre-compute the fitted layer so we can extract the data out of it with 
# layer_data()
fitted_layer <- forecast::autolayer(model.ses.fc$fitted, series="Fitted")
fitted_values <- fitted_layer$layer_data()

plt <- forecast::autoplot(mdeaths) +
  fitted_layer +
  geom_point() +
  geom_point(data = fitted_values, aes(x = timeVal, y = seriesVal))

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

Может быть способ заставить forecast::autolayer делать то, что вы хотите, напрямую, но это решение работает. Если вы хотите, чтобы легенда выглядела правильно, вам нужно объединить входные данные и подходящие значения в один data.frame.

person amoeba    schedule 13.04.2019
comment
Помогает, спасибо @amoeba! Техника распространилась и на элемент прогноза. Удобно размещать обычный (но предварительно скомпилированный) geom_point() вместе с autolayer(). Было бы хорошо расширить последнее напрямую, как вы говорите, но, поскольку мы не знаем внутренностей, это отличное решение. - person TickboxPhil; 14.04.2019