БъздаванС Π½Π° Π°Π½ΠΈΠΌΠΈΡ€Π°Π½ΠΈ хистограми с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° R

БъздаванС Π½Π° Π°Π½ΠΈΠΌΠΈΡ€Π°Π½ΠΈ хистограми с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° R

Анимирани хистограми, ΠΊΠΎΠΈΡ‚ΠΎ ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° Π±ΡŠΠ΄Π°Ρ‚ Π²Π³Ρ€Π°Π΄Π΅Π½ΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π² публикация Π½Π° всСки сайт, стават всС ΠΏΠΎ-популярни. Π’Π΅ ΠΏΠΎΠΊΠ°Π·Π²Π°Ρ‚ Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΠ°Ρ‚Π° Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π½Π° всякакви характСристики Π·Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΏΠ΅Ρ€ΠΈΠΎΠ΄ ΠΎΡ‚ Π²Ρ€Π΅ΠΌΠ΅ ΠΈ Π³ΠΎ правят Π²ΠΈΠ·ΡƒΠ°Π»Π½ΠΎ. НСка Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊ Π΄Π° Π³ΠΈ създадСм с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° R ΠΈ унивСрсални ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ.

Skillbox ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π²Π°: ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈ курс β€žPython-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΎΡ‚ Π½ΡƒΠ»Π°Ρ‚Π°β€œ.

НапомнямС: Π·Π° всички Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ Π½Π° Β«Π₯Π°Π±Ρ€Π°Β» β€” ΠΎΡ‚ΡΡ‚ΡŠΠΏΠΊΠ° ΠΎΡ‚ 10 000 Ρ€ΡƒΠ±Π»ΠΈ ΠΏΡ€ΠΈ записванС Π½Π° всСки курс Skillbox с ΠΏΡ€ΠΎΠΌΠΎΠΊΠΎΠ΄ Β«Π₯Π°Π±Ρ€Β».

ΠŸΠ°ΠΊΠ΅Ρ‚ΠΈΡ‚Π΅

НуТдаСм сС ΠΎΡ‚ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ Π² R:

Π’Π΅Π·ΠΈ Π΄Π²Π° са Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ. ОсвСн Ρ‚ΠΎΠ²Π° Ρ‰Π΅ Π½ΠΈ трябват tidyverse, janitor ΠΈ scales Π·Π° ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π°Π½Π½ΠΈΡ‚Π΅, почистванС Π½Π° масива ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€Π°Π½Π΅ ΡΡŠΠΎΡ‚Π²Π΅Ρ‚Π½ΠΎ.

Π”Π°Π½Π½ΠΈ

ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΈΡΡ‚ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π² Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, сС изтСгля ΠΎΡ‚ сайта Π½Π° Π‘Π²Π΅Ρ‚ΠΎΠ²Π½Π°Ρ‚Π° Π±Π°Π½ΠΊΠ°. Π•Ρ‚ΠΎ Π³ΠΈ β€” WorldBank Data. Π‘ΡŠΡ‰ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ, Π°ΠΊΠΎ Π²ΠΈ трябват Π² Π³ΠΎΡ‚ΠΎΠ² Π²ΠΈΠ΄, ΠΌΠΎΠ³Π°Ρ‚ Π΄Π° сС изтСглят ΠΎΡ‚ ΠΏΠ°ΠΏΠΊΠ°Ρ‚Π° Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Каква информация Π΅ Ρ‚ΠΎΠ²Π°? Π˜Π·Π²Π°Π΄ΠΊΠ°Ρ‚Π° ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° стойността Π½Π° Π‘Π’ΠŸ Π½Π° ΠΏΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ страни Π·Π° няколко Π³ΠΎΠ΄ΠΈΠ½ΠΈ (ΠΎΡ‚ 2000 Π΄ΠΎ 2017 Π³ΠΎΠ΄ΠΈΠ½Π°).

ΠžΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Π΄Π°Π½Π½ΠΈΡ‚Π΅

Π©Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΊΠΎΠ΄Π°, посочСн ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ, Π·Π° ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° Π½Π° нСобходимия Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π½Π° Π΄Π°Π½Π½ΠΈΡ‚Π΅. ΠŸΠΎΡ‡ΠΈΡΡ‚Π²Π°ΠΌΠ΅ ΠΈΠΌΠ΅Π½Π°Ρ‚Π° Π½Π° ΠΊΠΎΠ»ΠΎΠ½ΠΈΡ‚Π΅, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ²Π°ΠΌΠ΅ числата Π² числов Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΈ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€Π°ΠΌΠ΅ Π΄Π°Π½Π½ΠΈΡ‚Π΅ с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° функцията gather(). Всичко, ΠΊΠΎΠ΅Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ, Ρ‰Π΅ Π·Π°ΠΏΠ°Π·ΠΈΠΌ Π² gdp_tidy.csv Π·Π° ΠΏΠΎ-Π½Π°Ρ‚Π°Ρ‚ΡŠΡˆΠ½Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π°.

Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°(tidyverse)
Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°(janitor)

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

#select required columns

gdp % select(3:15)

#filter only country rows

gdp <- gdp[1:217,]

gdp_tidy %
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.

Π—Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈΡ‚Π΅

  • Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°(tidyverse)
  • library(gganimate)

Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Π΄Π°Π½Π½ΠΈΡ‚Π΅

На Ρ‚ΠΎΠ·ΠΈ Π΅Ρ‚Π°ΠΏ трябва Π΄Π° Ρ„ΠΈΠ»Ρ‚Ρ€ΠΈΡ€Π°ΠΌΠ΅ Π΄Π°Π½Π½ΠΈΡ‚Π΅, Π·Π° Π΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ Ρ‚ΠΎΠΏ-10 страни Π·Π° всяка Π³ΠΎΠ΄ΠΈΠ½Π°. ДобавямС няколко ΠΊΠΎΠ»ΠΎΠ½ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Ρ‰Π΅ позволят Π΄Π° сС ΠΏΠΎΠΊΠ°Π·Π²Π° Π»Π΅Π³Π΅Π½Π΄Π° Π·Π° хистограмата.

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

gdp_formatted %
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 %
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 = 'Π‘Π’ΠŸ Π½Π° Π³ΠΎΠ΄ΠΈΠ½Π° : {closest_state}',
subtitle = "Π’ΠΎΠΏ 10 Π΄ΡŠΡ€ΠΆΠ°Π²ΠΈ",
caption = "Π‘Π’ΠŸ Π² ΠΌΠΈΠ»ΠΈΠ°Ρ€Π΄ΠΈ USD | Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ Π½Π° Π΄Π°Π½Π½ΠΈ: Π‘Π²Π΅Ρ‚ΠΎΠ²Π½Π° Π±Π°Π½ΠΊΠ°")

Π Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³

Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ анимацията бъдС създадСна ΠΈ Π·Π°ΠΏΠ°Π·Π΅Π½Π° Π² ΠΎΠ±Π΅ΠΊΡ‚Π° 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

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС с Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster