Π‘ΡŠΠ·Π΄Π°ΠΉΡ‚Π΅ Π°Π½ΠΈΠΌΠΈΡ€Π°Π½ΠΈ хистограми с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° R

Π‘ΡŠΠ·Π΄Π°ΠΉΡ‚Π΅ Π°Π½ΠΈΠΌΠΈΡ€Π°Π½ΠΈ хистограми с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° R

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

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

НапомнямС Π²ΠΈ: Π·Π° всички Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ Π½Π° "Habr" - ΠΎΡ‚ΡΡ‚ΡŠΠΏΠΊΠ° ΠΎΡ‚ 10 000 Ρ€ΡƒΠ±Π»ΠΈ ΠΏΡ€ΠΈ записванС във всСки курс Skillbox, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ промоционалния ΠΊΠΎΠ΄ Π½Π° "Habr".

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

ИмамС Π½ΡƒΠΆΠ΄Π° ΠΎΡ‚ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ Π² R:

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

Π”Π°Π½Π½ΠΈ

ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΈΡΡ‚ Π½Π°Π±ΠΎΡ€ ΠΎΡ‚ Π΄Π°Π½Π½ΠΈ, ΠΊΠΎΠΉΡ‚ΠΎ Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π² Ρ‚ΠΎΠ·ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π΅ ΠΈΠ·Ρ‚Π΅Π³Π»Π΅Π½ ΠΎΡ‚ уСбсайта Π½Π° Π‘Π²Π΅Ρ‚ΠΎΠ²Π½Π°Ρ‚Π° Π±Π°Π½ΠΊΠ°. Π•Ρ‚ΠΎ Π³ΠΈ ΠΈ тях - Π”Π°Π½Π½ΠΈ Π½Π° Π‘Π²Π΅Ρ‚ΠΎΠ²Π½Π°Ρ‚Π° Π±Π°Π½ΠΊΠ°. Π‘ΡŠΡ‰ΠΈΡ‚Π΅ Π΄Π°Π½Π½ΠΈ, Π°ΠΊΠΎ Π²ΠΈ трябват Π³ΠΎΡ‚ΠΎΠ²ΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΈ ΠΈΠ·Ρ‚Π΅Π³Π»ΠΈΡ‚Π΅ ΠΎΡ‚ ΠΏΠ°ΠΏΠΊΠΈ с ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈ.

Π©ΠΎ Π·Π° информация Π΅ Ρ‚ΠΎΠ²Π°? Π˜Π·Π²Π°Π΄ΠΊΠ°Ρ‚Π° ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° стойността Π½Π° Π‘Π’ΠŸ Π½Π° ΠΏΠΎΠ²Π΅Ρ‡Π΅Ρ‚ΠΎ страни Π·Π° няколко Π³ΠΎΠ΄ΠΈΠ½ΠΈ (ΠΎΡ‚ 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.

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

  • Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° (tidyverse)
  • Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° (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(). Π’Π΅ са Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΈ, Ρ‚Π°ΠΊΠ° Ρ‡Π΅ всички Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ Π΄Π° оТивяват Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ. Някои ΠΎΡ‚ тях ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π΅ Π±ΡŠΠ΄Π°Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΈ, Π°ΠΊΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€: НачСртани са само Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»Π½ΠΈΡ‚Π΅ Π»ΠΈΠ½ΠΈΠΈ Π½Π° ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π° ΠΈ Π»Π΅Π³Π΅Π½Π΄ΠΈΡ‚Π΅, Π½ΠΎ заглавията Π½Π° оситС ΠΈ няколко Π΄Ρ€ΡƒΠ³ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° са ΠΏΡ€Π΅ΠΌΠ°Ρ…Π½Π°Ρ‚ΠΈ ΠΎΡ‚ областта.

анимация

ΠšΠ»ΡŽΡ‡ΠΎΠ²Π°Ρ‚Π° функция Ρ‚ΡƒΠΊ Π΅ conversion_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 ΠΏΡ€Π΅ΠΏΠΎΡ€ΡŠΡ‡Π²Π°:

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€