Ствараем аніміраваныя гістаграмы пры дапамозе 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

Дадаць каментар