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']
Самый простой пример визуализации будет выглядеть следующим образом:
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