Введение

dygraphs - мощный и современный пакет для визуализации данных временных рядов в R. Важное преимущество dygraphs перед ggplot в том, что пакет создает интерактивные графики, которые можно встроить как в документы R Markdown (такой, как этот), и в веб-приложения.

Установка пакета

Если вы используете дистрибутив R, подготовленный для курса, то пакет dygraphs у вас уже есть.

Если вы устанавливали R самостоятельно, то пакет нужно установить (раскомментируйте и запустите команду):

#install.packages("dygraphs")

После этого, вы сможете подключить этот и другие необходимые пакеты обычным образом:

library(dygraphs) # интерактивная визуализация временных рядов
library(forecast) # прогнозирование
library(sophisthse) # загрузка данных из ЕАЭСД вышки
library(lubridate) # гладкая работа с датами

Базовые примеры

Теперь, когда у вас установлен и подключен пакет dygraphs, можно приступить к визуализации.

В качестве примера возьмем данные из Единого архива социально-экономических данных НИУ ВШЭ. Мы будем работать с двумя показателями - RTRD_M и RTRD_M_DIRI.

df <- sophisthse('RTRD_M') %>% 
  window(start = c(1995, 1))
time_series1 <- df[, 'RTRD_M']
time_series2 <- df[, 'RTRD_M_DIRI']

Hello, world!

Самый простой пример визуализации будет выглядеть следующим образом:

dygraph(time_series1)

Вы можете заметить, что в отличии от графиков ggplot, графики dygraphs интерактивны - наведя на график курсор мыши, можно посмотреть, какое значение имеет каждая точка в определенный момент времени.

Обратите внимание, что если выделить мышкой определенный участок по горизонтали или по вертикали (так же, как выделяется текст), то dygraphs приблизит его. Обратно можно вернуться по двойному щелчку.

Далее рассмотрим, каким образом можно изменять внешний вид графика.

Отображение нескольких временных рядов

Для того, чтобы отобразить несколько временных рядов, достаточно объединить эти ряды при помощи функции cbind():

two_series <- cbind(time_series1, time_series2)

head(two_series, 12)
##          time_series1 time_series2
## Jan 1995         27.3         98.6
## Feb 1995         28.1         92.3
## Mar 1995         32.9         99.2
## Apr 1995         33.4         93.2
## May 1995         39.4        102.5
## Jun 1995         41.7        102.4
## Jul 1995         43.7        102.4
## Aug 1995         47.5        106.3
## Sep 1995         49.4        105.9
## Oct 1995         52.7        108.4
## Nov 1995         55.1        108.6
## Dec 1995         60.7        116.0
dygraph(two_series)

Добавление подписей

Чтобы добавить заголовок к самому графику, достаточно в аргументах функции dygraph написать: main = "Текст заголовка".

dygraph(two_series, main = "Два графика")

В этом графике недостает адекватных подписей в легенде. Их можно добавить к графику при помощи оператора %>% (pipe, или конвейер). Вспомним, что эта операция работает слева направо и передает данные слева от оператора в функцию, указанную справа от оператора %>%.

Чтобы изменить подписи данных, необходимо добавить к графику, построенному функцией dygraph(), дополнительные параметры при помощи %>% и dySeries("название ряда, как в вашем коде", label = "Название, которое будет на графике").

dygraph(two_series, main = "Два графика") %>%
  dySeries("time_series1", label = "Первый ряд") %>%
  dySeries("time_series2", label = "Второй ряд")

Чтобы изменить подписи осей, нужно добавить параметры функции dygraph(): xlab = "Название оси Х" и ylab = "Название оси Y", как в следующем коде:

dygraph(two_series, 
        main = "Два графика", 
        xlab = "Годы", 
        ylab = "Значение показателя") %>%
  dySeries("time_series1", label = "Первый ряд") %>%
  dySeries("time_series2", label = "Второй ряд")

Дополнительные опции визуализации

При желании, при помощи добавления различных опций можно усовершенствовать внешний вид графика - например, поменять цвета, с которыми отображаются временные ряды. Это можно сделать, добавив функцию dyOptions(), как в следующем коде.

dygraph(two_series, 
        main = "Два графика", 
        xlab = "Годы", 
        ylab = "Значение показателя") %>%
  dySeries("time_series1", label = "Первый ряд") %>%
  dySeries("time_series2", label = "Второй ряд") %>%
  dyOptions(colors = RColorBrewer::brewer.pal(3, "Set2"))

Параметры, указанные в функции dyOptions() влияют на все ряды в графике. Для того, чтобы менять параметры определенных частей графика, необходимо добавить параметры к функциям, рисующим эти части графика.

Например, чтобы рисовать линию первого ряда толще, нужно добавить в dySeries() c time_series1 параметр strokeWidth = 2. Если этот же параметр указать в dyOptions(), толще станут все линии временных рядов.

dygraph(two_series, 
        main = "Два графика", 
        xlab = "Годы", 
        ylab = "Значение показателя") %>%
  dySeries("time_series1", label = "Первый ряд", strokeWidth = 2) %>%
  dySeries("time_series2", label = "Второй ряд")

Легенду графика тоже можно настроить. Например, можно сделать так, чтобы она следовала за мышью.

dygraph(two_series, 
        main = "Два графика", 
        xlab = "Годы", 
        ylab = "Значение показателя") %>%
  dySeries("time_series1", label = "Первый ряд", strokeWidth = 2) %>%
  dySeries("time_series2", label = "Второй ряд") %>%
  dyLegend(show = "follow")

Выделение событий на графике

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

dygraph(time_series1, main = "График с событиями") %>%
  dyEvent(dmy("01.01.2009"), "Кризисный 2009 год", labelLoc = "top") %>%
  dyEvent(dmy("01.01.2014"), "2014 год", labelLoc = "bottom") %>%
  dyAnnotation(dmy("01.12.2014"), 
               text = "A", 
               tooltip = "Пиковое значение") #наведите мышь на квадрат с буквой A, чтобы посмотреть текст

Визуализация результатов прогнозирования

В качестве основы для прогнозирования возьмем ряд time_series1.

ts_subset <- time_series1 %>% 
  window(start = c(2014, 1)) #возьмем ряд поменьше
hw <- HoltWinters(ts_subset)
p <- predict(hw, n.ahead = 12, prediction.interval = TRUE)

p %>% head() %>% round()
##           fit  upr  lwr
## Aug 2019 2895 2965 2824
## Sep 2019 2864 2935 2792
## Oct 2019 2883 2956 2810
## Nov 2019 2887 2961 2812
## Dec 2019 3417 3493 3341
## Jan 2020 2605 2682 2528
dygraph(p, "Прогноз") %>%
  dySeries(c("lwr", "fit", "upr")) #сообщаем dySeries, что именно из входных данных нам нужно визуализировать - в данном случае, lwr fit и upr - составные части полученного прогноза.

Для сравнения, добавим на график исторические данные. Для этого “склеим” исходный ряд и прогноз:

# Склеиваем данные
all <- cbind(ts_subset, p)
all %>% tail(14)
##          ts_subset    p.fit    p.upr    p.lwr
## Jun 2019    2731.1       NA       NA       NA
## Jul 2019    2792.9       NA       NA       NA
## Aug 2019        NA 2894.792 2965.087 2824.498
## Sep 2019        NA 2863.584 2935.284 2791.883
## Oct 2019        NA 2882.658 2955.738 2809.579
## Nov 2019        NA 2886.771 2961.203 2812.338
## Dec 2019        NA 3416.882 3492.644 3341.120
## Jan 2020        NA 2605.349 2682.417 2528.281
## Feb 2020        NA 2549.802 2628.154 2471.449
## Mar 2020        NA 2770.196 2849.813 2690.580
## Apr 2020        NA 2746.127 2826.987 2665.266
## May 2020        NA 2789.838 2871.924 2707.753
## Jun 2020        NA 2833.523 2916.816 2750.231
## Jul 2020        NA 2897.751 2982.233 2813.268
# Визуализация
dygraph(all, "Прогноз") %>%
  dySeries("ts_subset", label = "Actual") %>%
  dySeries(c("p.lwr", "p.fit", "p.upr"), label = "Predicted")

Замечание: при склеивании данных функция cbind() добавляет к именам столбцов из второй таблицы префикс с ее именем.

Выбор интервала наблюдений

Пакет dygraphs также имеет удобный инструмент для выбора границ наблюдений.

dygraph(two_series, 
        main = "График с выбором границ наблюдений", 
        xlab = "Годы", 
        ylab = "Значение показателя") %>%
  dySeries("time_series1", label = "Первый ряд") %>%
  dySeries("time_series2", label = "Второй ряд") %>%
  dyLegend(show = "follow") %>%
  dyRangeSelector() #если передать ему параметр dateWindow = c("1999-01-01", "2002-01-01") то график изначально будет в указанных границах

Ресурсы

В этом документе были рассмотрены несколько простых примеров, полезных при изучении временных рядов в рамках нашего семинара. Другие примеры, а также детальное руководство по использованию пакета можно найти здесь: https://rstudio.github.io/dygraphs/index.html