Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π°Π½ΠΈΠΌΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ гистограммы ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ 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

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ