Створюємо анімовані гістограми за допомогою R

Створюємо анімовані гістограми за допомогою R

Анімовані гістограми, які можна вбудувати прямо в публікацію на будь-якому сайті, стають все популярнішими. Вони відображають динаміку змін будь-яких характеристик за певний час та роблять це наочно. Давайте подивимося, як їх створити за допомогою R та універсальних пакетів.

Skillbox рекомендує: Практичний курс "Python-розробник з нуля".

Нагадуємо: для всіх читачів "Хабра" - знижка 10 000 рублів при записі на будь-який курс Skillbox за промокодом "Хабр".

пакети

Нам потрібні пакети в R:

Ці два конче необхідні. Крім того, будуть потрібні tidyverse, janitor і scales для управління даними, очищення масиву та форматування відповідно.

Дані

Оригінальний набір даних, який ми будемо використовувати у цьому проекті, завантажується із сайту Світового банку. Ось вони - WorldBank Data. Ті ж дані, якщо вони вам потрібні у готовому вигляді, можна завантажити з папки проекту.

Що за інформація? Вибірка містить значення ВВП більшості країн за кілька років (з 2000 до 2017 року).

Обробка даних

Ми будемо використовувати нижченаведений код для підготовки необхідного формату даних. Очищаємо назви стовпців, перетворюємо цифри на числовий формат і конвертуємо дані за допомогою функції gather(). Все, що отримано, зберігаємо у gdp_tidy.csv для подальшого використання.

library(tidyverse)
library(janitor)

gdp <- read_csv("./data/GDP_Data.csv")

#select required columns

gdp <- gdp %>% select(3:15)

#filter only country rows

gdp <- gdp[1:217,]

gdp_tidy <- gdp %>%
mutate_at(vars(contains("YR")),as.numeric) %>%
gather(year,value,3:13) %>%
janitor::clean_names() %>%
mutate(year = as.numeric(stringr::str_sub(year,1,4)))

write_csv(gdp_tidy,"./data/gdp_tidy.csv")

Анімовані гістограми

Їх створення потребує двох етапів:

  • Побудова повного набору актуальних гістограм із використанням ggplot2.
  • Анімація статичних гістограм з бажаними параметрами за допомогою gganimate.

Фінальний крок – рендеринг анімації у бажаному форматі, включаючи GIF або MP4.

Завантаження бібліотек

  • library(tidyverse)
  • library(gganimate)

Управління даними

На цьому етапі треба відфільтрувати дані для отримання топ-10 країн кожного року. Додамо кілька стовпчиків, які дозволять відображати легенду для гістограми.

gdp_tidy <- read_csv("./data/gdp_tidy.csv")

gdp_formatted <- gdp_tidy %>%
group_by(year) %>%
# The * 1 makes it possible to have non-integer ranks while sliding
mutate(rank = rank(-value),
Value_rel = value/value[rank==1],
Value_lbl = paste0(" ",round(value/1e9))) %>%
group_by(country_name) %>%
filter(rank <=10) %>%
ungroup()

Побудова статичних гістограм

Тепер, коли ми маємо пакет даних у потрібному форматі, починаємо малювання статичних гістограм. Базова інформація — топ-10 країн із максимальним ВВП за вибраний інтервал часу. Графіки будуємо кожного року.

staticplot = ggplot(gdp_formatted, aes(rank, group = country_name,
fill = as.factor(country_name), color = as.factor(country_name))) +
geom_tile(aes(y = value/2,
height = value,
width = 0.9), alpha = 0.8, color = NA) +
geom_text(aes(y = 0, label = paste(country_name, " ")), vjust = 0.2, hjust = 1) +
geom_text(aes(y=value,label = Value_lbl, hjust=0)) +
coord_flip(clip = "off", expand = FALSE) +
scale_y_continuous(labels = scales::comma) +
scale_x_reverse() +
guides(color = FALSE, fill = FALSE) +
theme(axis.line=element_blank(),
axis.text.x=element_blank(),
axis.text.y=element_blank(),
axis.ticks=element_blank(),
axis.title.x=element_blank(),
axis.title.y=element_blank(),
legend.position="none",
panel.background=element_blank(),
panel.border=element_blank(),
panel.grid.major=element_blank(),
panel.grid.minor=element_blank(),
panel.grid.major.x = element_line( size=.1, color="grey" ),
panel.grid.minor.x = element_line( size=.1, color="grey" ),
plot.title=element_text(size=25, hjust=0.5, face="bold", colour="grey", vjust=-1),
plot.subtitle=element_text(size=18, hjust=0.5, face="italic", color="grey"),
plot.caption =element_text(size=8, hjust=0.5, face="italic", color="grey"),
plot.background=element_blank(),
plot.margin = margin(2,2, 2, 4, "cm"))

Будувати графіки з використанням ggplot2 дуже просто. Як ви можете бачити в ділянці коду вище, є кілька ключових моментів з функцією theme(). Вони необхідні, щоб усі елементи анімувалися без проблем. Деякі з них можна і не відображати у разі потреби. Приклад: промальовуються лише вертикальні лінії сітки та легенди, а ось заголовки осей та ще кілька компонентів видаляються з ділянки.

Анімація

Ключова функція тут transition_states(), вона склеює окремі статичні графіки. view_follow() використовується для промальовування ліній сітки.

anim = staticplot + transition_states(year, transition_length = 4, state_length = 1) +
view_follow(fixed_x = TRUE) +
labs(title = 'GDP per Year : {closest_state}',
subtitle = "Top 10 Countries",
caption = "GDP in Billions USD | Data Source: World Bank Data")

Візуалізація

Після того, як анімація створена та збережена в об'єкті anim, настав час її візуалізувати за допомогою функції animate(). Рендерер, який використовується в animate(), може бути різним залежно від типу необхідного вихідного файлу.

GIF

# For GIF

animate(anim, 200, fps = 20, width = 1200, height = 1000,
renderer = gifski_renderer("gganim.gif"))

MP4

# For MP4

animate(anim, 200, fps = 20, width = 1200, height = 1000,
renderer = ffmpeg_renderer()) -> for_mp4

anim_save("animation.mp4", animation = for_mp4 )

Результат

Створюємо анімовані гістограми за допомогою R

Як бачимо, нічого складного. Весь проект доступний у моєму GitHub, можете використовувати його так, як вважаєте за потрібне.

Skillbox рекомендує:

Джерело: habr.com

Додати коментар або відгук