Дещо з візуалізації багатовимірних часових рядів в R

Як наочно показати на графіку фінансові або метеорологічні часові ряди? Особливо, якщо базовою одиницею часу є доба, а значення при цьому вимірюються багато разів на добу?
Одним зі способів є відображення на часовій шкалі основних статистик. В одній зі статей ми розглядали відображення середнього значення на “календарній діаграмі”. Можливий інший підхід, коли ми за допомогою геометричної фігури (точка) відображуємо положення середнього арифметичного (або медіани/мінімального/максимального) у певний момент часу. Але є і третій варіант: ми можемо візуалізувати одразу декілька статистик. Наприклад, відобразити на графіку одночасно мінімальне, максимальне та середнє значення. Такі діаграми несуть набагато більше інформації, ніж звичайні “лінійно-точкові” графіки. Окрім відображення характерної статистики, ці діаграми дають змогу відобразити мінливість значень за певний проміжок часу. Тобто ми одразу візуалізуємо і центральну тенденцію, і мінливість. Діаграми саме цього різновиду ми з Вами і побудуємо. Ідею побудови подібної діаграми взято з сайту textura.in.ua.

В якості первинних даних ми використаємо дані декількох метеорологічних станцій. Для підготовки даних застосуємо пакет dplyr програмного середовища R. А для побудови діаграми – використаємо пакет ggplot2.

Наша таблиця містить 99932 рядків, які містять інформацію про назву метеорологічної станції (поле “punkt”), дату та час проведення вимірювань (“date2”) та температуру повітря (“T”).
Завантажуємо робочу таблицю “bigmeteo2” у робочій простір R в якості data.frame:

bigmeteo2<- read.csv("bigmeteo2.csv", headers=TRUE, sep=";", dec=".")

Тепер переформатуємо дані дати і часу в формат POSIXlt/POSIXt:

bigmeteo2$date2 <- strptime(as.character(bigmeteo2$date2), format = "%Y-%m-%d %H:%M:%S",  tz = "Europe/Kiev")

Завантажуємо потрібні пакети dplyr, ggplot2 та scales (останній потрібен для гнучкого налаштування відображень різних шкал на осях графіків):

library(dplyr)
library(ggplot2)
library(scales)

Тепер приступимо до побудови діаграми. Нас цікавить візуальне порівняння зміни мінімальних, максимальних та середніх показників температури щодня упродовж 2013 року. При цьому ми ще хочемо побачити як розрізняються між собою ці показники на різних метеорологічних станціях. Для вирішення цієї задачи нам треба побудувати графік, на якому ми зможемо відобразити всі три показники (мінімальне, середнє, максимальне значення температури повітря) для кожного дня 2013 року і, при цьому, розділити область побудови на декілька підграфіків для відображення окремо даних з кожної метеорологічної станції. Мінімальне та максимальне значення температури для кожного дня ми відобразимо крайовими частинами ліній, а середнє значення – відобразимо кольоровим градієнтом. При формуванні проміжних таблиць та побудові діаграми ми використаємо “конвейєр” (“pipe”), який задається командою “%>%”.

Формуємо на конвейєрі проміжні таблиці та будуємо кінцеву діаграму:

png("bigmeteo2_T.png", width = 297, height = 210, units = "mm", res = 150)
tbl_df(bigmeteo2) %>%#подаємо data.frame "bigmeteo2" на конвейєр
mutate(date.tmp = as.Date(format(date2, "%Y%m%d"), "%Y%m%d")) %>%#переводимо поле date2 в поле іншого формату і відкидуємо при цьому значення часу замірів
select(-date2) %>%#викидаємо з таблиці поле date2 у форматі POSIXlt/POSIXt
filter(format(date.tmp, "%Y") == 2013) %>%#вибираємо дані лише за 2013 рік
group_by(punkt, date.tmp) %>%#групуємо дані за назвами метеостанцій та датами вимірювань
summarise(mint = min(T, na.rm = TRUE), maxt = max(T, na.rm = TRUE), avt = mean(T, na.rm = TRUE)) %>%#обчислюємо потрібні показники
ggplot(aes(x = date.tmp, y = avt))+#починаємо побудову діаграми
geom_linerange(aes(x = date.tmp, y = avt, ymin = mint, ymax = maxt, colour = avt))+#будуємо лінії показників для кожного дня
facet_wrap(~punkt, nrow = 2)+#розділяємо діаграму на окремі підграфіки для кожної з метеорологічних станцій
#   coord_polar()+#цей параметр ми відкриємо пізніше для побудови полярних діаграм по кожній зі станцій
scale_colour_gradient2(name = "Середньодобова температура (°C): ", limits = c(-15, 40), low = "navy", mid = "yellow3", high = "orangered3", midpoint = 10)+#налаштовуємо кольори та написи легенди
scale_x_date(breaks = "1 month", minor_breaks = "1 week", labels = date_format("%h"))+#налаштовуємо відображення осі X (саме тут працюють функції пакету scales); в якості підписів ми будемо використовувати скорочені назви місяців
labs(y = "температура, °C", x = "календарні дні, місяці", title = "Добова мінливість температури\nза даними декількох навколишніх метеостанцій")+#налаштовуємо підписи осей та заголовок
theme(text = element_text(family = "Liberation Serif", face = "italic", size = 15, colour = "orangered4", lineheight = 0.8), legend.position = "bottom", legend.text = element_text(family = "Liberation Serif", face = "italic", size = 9, colour = "orangered4", lineheight = 0.8), axis.text = element_text(colour = "gray15", face="bold", size= 9), axis.ticks = element_line(colour = "orange", size = 0.2), plot.background = element_rect(fill = "gray95"), panel.grid.major = element_line(colour = "orange", size = 0.2), panel.background = element_rect(fill = "gray90"))#виконуємо тонкі налаштування відображення: змінюємо шрифти, кольори, розміри...
dev.off()#закриваємо експорт графіки та зберігаємо діаграму в графічний файл

 Результатом виконання всієї послідовності команд буде діаграма:

Діаграма добової мінливості температури на різних метеостанціях в декартовій системі координат

Діаграма добової мінливості температури на різних метеостанціях в декартовій системі координат

Але ми, виконуючи наведений вище програмний код, залишили закритим (закоментованим) один рядок: “coord_polar()+”. Цей рядок перетворює діаграму з декартової системи координат на полярну діаграму. Давайте відкриємо це рядок:

...
facet_wrap(~punkt, nrow = 2)+#розділяємо діаграму на окремі підграфіки для кожної з метеорологічних станцій
coord_polar()+#переводимо діаграму в полярну систему координат
scale_colour_gradient2(name = "Середньодобова температура (°C): ", limits = c(-15, 40), low = "navy", mid = "yellow3", high = "orangered3", midpoint = 10)+#налаштовуємо кольори та написи легенди
...

Результатом виконання всього коду разом із рядком “coord_polar()+” буде наступна діаграма:

Діаграма добової мінливості температури на різних метеостанціях в полярній системі координат

Діаграма добової мінливості температури на різних метеостанціях в полярній системі координат

І на останок я зазначу параметри системи, версію R та перелік завантажених пакетів:

sessionInfo()
R version 3.2.0 (2015-04-16)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Debian GNU/Linux stretch/sid
locale:
[1] LC_CTYPE=uk_UA.UTF-8 LC_NUMERIC=C LC_TIME=uk_UA.UTF-8
[4] LC_COLLATE=uk_UA.UTF-8 LC_MONETARY=uk_UA.UTF-8 LC_MESSAGES=uk_UA.UTF-8
[7] LC_PAPER=uk_UA.UTF-8 LC_NAME=C LC_ADDRESS=C
[10] LC_TELEPHONE=C LC_MEASUREMENT=uk_UA.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] ggplot2_1.0.1 scales_0.2.4 dplyr_0.4.1
...

Якщо Вам сподобалась стаття – можете віддячити автору невеликим пожертвуванням на гаманці WebMoney Z237214434315, U396004717050 чи R337925998765; або ж на картку ПриватБанку 5167982301844061

Leave a Comment