Как добавить скользящее среднее к одной переменной с помощью ggplot2 и plotly

Я создал сюжет, используя ggplot и plotly. У меня есть две переменные в моем наборе данных, и я хотел бы добавить 12-месячное скользящее среднее одной из переменных (headline inflation в данном случае). Я считаю, что geom_ma не поддерживается в plotly, поэтому я ищу решение, которое будет работать с plotly

p1 <- ggplot(inflation, aes(Date)) +
  geom_line(aes(y=`Core Inflation`,col = '#75002B'), size = 1.5) +
  geom_line(aes(y=`Headline Inflation`,col = '#EFBE93'), size = 1.5) +
  geom_ma(aes(y = `Headline Inflation`, col = '#BD215B'), ma_fun = SMA,n=12, size=1.5) +
  theme_bw() +
  labs(y='Annual Inflation Rate (%)',color = "") +
  scale_color_manual(values = c("#75002B",'#BD215B', "#EFBE93"),
                     labels = c('Core','MA','Headline'))

p1 %>% ggplotly() 

РЕДАКТИРОВАТЬ. Я изменил свой набор данных с длинного на широкий формат и запускал каждый geom_line отдельно, так как я изо всех сил пытался запустить geom_ma только для переменной headline inflation, когда мои данные были в длинном формате.

structure(list(Date = structure(c(16983, 17014, 17045, 17075, 
17106, 17136, 17167, 17198, 17226, 17257, 17287, 17318, 17348, 
17379, 17410, 17440, 17471, 17501, 17532, 17563, 17591, 17622, 
17652, 17683, 17713, 17744, 17775, 17805, 17836, 17866, 17897, 
17928, 17956, 17987, 18017, 18048, 18078, 18109, 18140, 18170, 
18201, 18231, 18262, 18293, 18322, 18353, 18383, 18414, 18444
), class = "Date"), `Headline Inflation` = c(6.99, 6.83, 6.9, 
7.26, 7.34, 7.3, 8.2, 7.75, 7.05, 6.68, 6.28, 6.08, 5.45, 5.37, 
5.57, 5.16, 5.18, 5.17, 3.56, 3.52, 3.51, 3.58, 3.84, 3.96, 4.46, 
4.41, 4.79, 5.12, 5.56, 5.15, 4.66, 4.42, 4.5, 4.53, 4.08, 3.94, 
3.64, 3.71, 2.93, 3.02, 2.46, 2.59, 2.05, 2.45, 2.35, 1.64, 2.06, 
2.15, 2.09), `Core Inflation` = c(6.24, 6.13, 6.36, 6.77, 6.75, 
6.83, 7.84, 7.65, 7.13, 6.96, 6.61, 6.63, 6.34, 6.38, 6.2, 5.83, 
5.81, 5.51, 3.55, 3.55, 3.49, 3.48, 3.58, 3.41, 3.65, 3.38, 3.95, 
4.1, 4.42, 4.42, 4.25, 4.21, 4.27, 4.39, 3.89, 3.85, 3.48, 3.7, 
2.77, 3.18, 2.84, 2.85, 1.63, 1.74, 1.67, 1.22, 2.43, 2.77, 2.86
)), row.names = c(NA, -49L), class = c("tbl_df", "tbl", "data.frame"
))

РЕДАКТИРОВАТЬ - мне удалось создать график в ggplot2, однако, когда я запустил его в ggplotly, я получаю сообщение об ошибке, в котором говорится, что geom_ma не поддерживается в plotly

Warning message: In geom2trace.default(dots[[1L]][[1L]], dots[[2L]][[1L]], dots[[3L]][[1L]]) :   geom_GeomMA() has yet to be implemented in plotly.   If you'd like to see this geom implemented,   Please open an issue with your example code at   https://github.com/ropensci/plotly/issues

person sa90210    schedule 16.08.2020    source источник
comment
Удалось ли вам заставить geom_ma () работать в целом без предварительного сюжета?   -  person Daniel Jachetta    schedule 16.08.2020
comment
@DanielJachetta удалось заставить geom_ma работать в ggplot2, но когда я пытаюсь вставить - ggplotly, появляется следующая ошибка Warning message: In geom2trace.default(dots[[1L]][[1L]], dots[[2L]][[1L]], dots[[3L]][[1L]]) : geom_GeomMA() has yet to be implemented in plotly. If you'd like to see this geom implemented, Please open an issue with your example code at https://github.com/ropensci/plotly/issues   -  person sa90210    schedule 16.08.2020
comment
Можете ли вы обновить свое сообщение кодом geom_ma, который работает без plotly?   -  person Ronak Shah    schedule 16.08.2020
comment
@RonakShah Я только что обновил   -  person sa90210    schedule 16.08.2020


Ответы (1)


Поскольку geom_ma еще не реализован в plotly. Вы можете рассчитать скользящее среднее, используя уже существующие функции. Я использую zoo::rollapplyr с функцией как mean.

library(tidyverse)
p1 <- inflation %>%
    mutate(moving_avg = zoo::rollapplyr(`Headline Inflation`, 2, 
                        mean, partial = TRUE)) %>%
    pivot_longer(cols = -Date) %>%
    ggplot() +  aes(Date, y = value, color = name) +
    geom_line(size = 1.5) + 
    theme_bw() +
    labs(y='Annual Inflation Rate (%)',color = "") +
    scale_color_manual(values = c("#75002B",'#BD215B', "#EFBE93"),
                       labels = c('Core','MA','Headline'))
p1

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

Обратите внимание, что есть также zoo::rollmeanr, который по умолчанию принимает mean, но в нем отсутствует аргумент partial = TRUE, поэтому он возвращает первые 12 значений как NA.

person Ronak Shah    schedule 16.08.2020
comment
Спасибо, @Ronak Shah! Извините еще один вопрос, я не могу изменить строку MA на пунктирную с моими данными в длинном формате? - person sa90210; 16.08.2020
comment
@ sa90210 вы можете использовать linetype = name в aes, а затем добавить scale_linetype_manual. Что-то вроде scale_linetype_manual(values=c("solid", "solid", "dashed")) - person Ronak Shah; 16.08.2020
comment
Спасибо, @Ronak Shah! Отлично работает - person sa90210; 16.08.2020