ΠšΡ€Π΅ΠΈΡ€Π°Ρ˜Ρ‚Π΅ Π°Π½ΠΈΠΌΠΈΡ€Π°Π½ΠΈ хистограми ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ R

ΠšΡ€Π΅ΠΈΡ€Π°Ρ˜Ρ‚Π΅ Π°Π½ΠΈΠΌΠΈΡ€Π°Π½ΠΈ хистограми ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ R

Π‘Γ¨ ΠΏΠΎΠΏΠΎΠΏΡƒΠ»Π°Ρ€Π½ΠΈ стануваат Π°Π½ΠΈΠΌΠΈΡ€Π°Π½ΠΈΡ‚Π΅ Ρ‚Π°Π±Π΅Π»ΠΈ со столбови ΠΊΠΎΠΈ ΠΌΠΎΠΆΠ°Ρ‚ Π΄Π° сС Π²Π³Ρ€Π°Π΄Π°Ρ‚ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π²ΠΎ објава Π½Π° која Π±ΠΈΠ»ΠΎ Π²Π΅Π±-страница. Π’ΠΈΠ΅ ја ΠΏΡ€ΠΈΠΊΠ°ΠΆΡƒΠ²Π°Π°Ρ‚ Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΠ°Ρ‚Π° Π½Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈΡ‚Π΅ Π²ΠΎ ΠΊΠ°ΠΊΠ²ΠΈ Π±ΠΈΠ»ΠΎ карактСристики Π²ΠΎ ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅ ΠΈ Π³ΠΎ ΠΏΡ€Π°Π²Π°Ρ‚ Ρ‚ΠΎΠ° јасно. АјдС Π΄Π° Π²ΠΈΠ΄ΠΈΠΌΠ΅ ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΈ ΠΊΡ€Π΅ΠΈΡ€Π°ΠΌΠ΅ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ R ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ‡ΠΊΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ.

Skillbox ΠΏΡ€Π΅ΠΏΠΎΡ€Π°Ρ‡ΡƒΠ²Π°: ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅Π½ курс β€žΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠ΅Ρ€ Π½Π° Python ΠΎΠ΄ Π½ΡƒΠ»Π°β€œ.

ΠŸΠΎΡ‚ΡΠ΅Ρ‚ΡƒΠ²Π°ΠΌΠ΅: Π·Π° ситС Ρ‡ΠΈΡ‚Π°Ρ‚Π΅Π»ΠΈ Π½Π° β€žΠ₯Π°Π±Ρ€β€œ - попуст ΠΎΠ΄ 10 Ρ€ΡƒΠ±Π»ΠΈ ΠΏΡ€ΠΈ Π·Π°ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π° кој Π±ΠΈΠ»ΠΎ курс Skillbox ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π³ΠΎ ΠΏΡ€ΠΎΠΌΠΎΡ‚ΠΈΠ²Π½ΠΈΠΎΡ‚ ΠΊΠΎΠ΄ β€žΠ₯Π°Π±Ρ€β€œ.

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

Ни Ρ‚Ρ€Π΅Π±Π°Π°Ρ‚ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΈ Π²ΠΎ Π :

ОвиС Π΄Π²Π΅ сС ΠΊΡ€Π°Ρ˜Π½ΠΎ Π½Π΅ΠΎΠΏΡ…ΠΎΠ΄Π½ΠΈ. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»Π½ΠΎ, ќС Π±ΠΈΠ΄Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ ΡƒΡ€Π΅Π΄Π½ΠΎ ΡƒΡ€Π΅Π΄ΡƒΠ²Π°ΡšΠ΅, чистач ΠΈ Π²Π°Π³Π° Π·Π° ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°ΡšΠ΅ со ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅, Ρ‡ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° Π½ΠΈΠ·Π°Ρ‚Π° ΠΈ соодвСтно Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€Π°ΡšΠ΅.

ΠŸΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ

ΠžΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π½Π°Ρ‚Π° Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΡˆΡ‚ΠΎ ќС ја користимС Π²ΠΎ овој ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π΅ ΠΏΡ€Π΅Π·Π΅ΠΌΠ΅Π½Π° ΠΎΠ΄ Π²Π΅Π±-страницата Π½Π° БвСтска Π±Π°Π½ΠΊΠ°. Π’ΡƒΠΊΠ° сС - ΠŸΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΎΠ΄ БвСтската Π±Π°Π½ΠΊΠ°. Π˜ΡΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ, Π΄ΠΎΠΊΠΎΠ»ΠΊΡƒ Π²ΠΈ Ρ‚Ρ€Π΅Π±Π°Π°Ρ‚ Π³ΠΎΡ‚ΠΎΠ²ΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΈ ΠΏΡ€Π΅Π·Π΅ΠΌΠ΅Ρ‚Π΅ ΠΎΠ΄ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π½ΠΈ ΠΏΠ°ΠΏΠΊΠΈ.

Каква ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ˜Π° Π΅ ΠΎΠ²Π°? ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΊΠΎΡ‚ ја содрТи врСдноста Π½Π° Π‘Π”ΠŸ Π½Π° ΠΏΠΎΠ²Π΅ΡœΠ΅Ρ‚ΠΎ зСмји Π·Π° Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ Π³ΠΎΠ΄ΠΈΠ½ΠΈ (ΠΎΠ΄ 2000 Π΄ΠΎ 2017 Π³ΠΎΠ΄ΠΈΠ½Π°).

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

ЌС Π³ΠΎ користимС ΠΊΠΎΠ΄ΠΎΡ‚ објавСн ΠΏΠΎΠ΄ΠΎΠ»Ρƒ Π·Π° Π΄Π° Π³ΠΎ ΠΏΠΎΠ΄Π³ΠΎΡ‚Π²ΠΈΠΌΠ΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΈΠΎΡ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ. Π“ΠΈ Π±Ρ€ΠΈΡˆΠ΅ΠΌΠ΅ ΠΈΠΌΠΈΡšΠ°Ρ‚Π° Π½Π° ΠΊΠΎΠ»ΠΎΠ½ΠΈΡ‚Π΅, Π³ΠΈ ΠΏΡ€Π΅Ρ‚Π²ΠΎΡ€Π°ΠΌΠ΅ Π±Ρ€ΠΎΠ΅Π²ΠΈΡ‚Π΅ Π²ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π½Π° Π±Ρ€ΠΎΠ΅Π²ΠΈ ΠΈ Π³ΠΈ ΠΏΡ€Π΅Ρ‚Π²ΠΎΡ€Π°ΠΌΠ΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ ја Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° collect(). Π‘Γ¨ ΡˆΡ‚ΠΎ Π΅ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΎ Π³ΠΎ Π·Π°Ρ‡ΡƒΠ²ΡƒΠ²Π°ΠΌΠ΅ Π²ΠΎ 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(). Π’ΠΈΠ΅ сС Π½Π΅ΠΎΠΏΡ…ΠΎΠ΄Π½ΠΈ Π·Π° ситС Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚ΠΈ Π΄Π° Π°Π½ΠΈΠΌΠΈΡ€Π°Π°Ρ‚ Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈ. НСкои ΠΎΠ΄ Π½ΠΈΠ² ΠΌΠΎΠΆΠ΅Π±ΠΈ Π½Π΅ΠΌΠ° Π΄Π° Π±ΠΈΠ΄Π°Ρ‚ ΠΏΡ€ΠΈΠΊΠ°ΠΆΠ°Π½ΠΈ Π΄ΠΎΠΊΠΎΠ»ΠΊΡƒ Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎ. ΠŸΡ€ΠΈΠΌΠ΅Ρ€: Π‘Π°ΠΌΠΎ Π²Π΅Ρ€Ρ‚ΠΈΠΊΠ°Π»Π½ΠΈΡ‚Π΅ Π»ΠΈΠ½ΠΈΠΈ Π½Π° ΠΌΡ€Π΅ΠΆΠ°Ρ‚Π° ΠΈ Π»Π΅Π³Π΅Π½Π΄ΠΈΡ‚Π΅ сС Π½Π°Ρ†Ρ€Ρ‚Π°Π½ΠΈ, Π½ΠΎ насловитС Π½Π° оскитС ΠΈ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ Π΄Ρ€ΡƒΠ³ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ сС отстранСти ΠΎΠ΄ областа.

ΠΠ½ΠΈΠΌΠ°Ρ†ΠΈΡ˜Π°

ΠšΠ»ΡƒΡ‡Π½Π°Ρ‚Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π° ΠΎΠ²Π΄Π΅ Π΅ 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 ΠΏΡ€Π΅ΠΏΠΎΡ€Π°Ρ‡ΡƒΠ²Π°:

Π˜Π·Π²ΠΎΡ€: www.habr.com

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€