БъздавамС Π°Π½ΠΈΠΌΠΈΡ€Π°Π½ΠΈ хистограми с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° 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