рдЖрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдПрдирд┐рдореЗрдЯреЗрдб рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдорд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН

рдЖрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдПрдирд┐рдореЗрдЯреЗрдб рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдорд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН

рдПрдирд┐рдореЗрдЯреЗрдб рдмрд╛рд░ рдЪрд╛рд░реНрдЯрд╣рд░реВ рдЬреБрди рд╕реАрдзрд╛ рдХреБрдиреИ рдкрдирд┐ рд╡реЗрдмрд╕рд╛рдЗрдЯрдорд╛ рдкреЛрд╕реНрдЯрдорд╛ рдЗрдореНрдмреЗрдб рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ рдмрдвреНрджреЛ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реБрдБрджреИрдЫред рддрд┐рдиреАрд╣рд░реВрд▓реЗ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордпрдорд╛ рдХреБрдиреИ рдкрдирд┐ рд╡рд┐рд╢реЗрд╖рддрд╛рд╣рд░реВрдорд╛ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВрдХреЛ рдЧрддрд┐рд╢реАрд▓рддрд╛ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрджрдЫ рд░ рдпреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛ рдЧрд░реНрдЫред R рд░ рдЬреЗрдиреЗрд░рд┐рдХ рдкреНрдпрд╛рдХреЗрдЬрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдХрд╕рд░реА рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗ рд╣реЗрд░реМрдВред

Skillbox рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрджрдЫ: рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд╛рдареНрдпрдХреНрд░рдо "рд╕реНрдХреНрд░реНрдпрд╛рдЪрдмрд╛рдЯ рдкрд╛рдЗрдерди рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛".

рд╣рд╛рдореА рд╕рдореНрдЭрд╛рдЙрдБрдЫреМрдВ: рд╕рдмреИ Habr рдкрд╛рдардХрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐ - Habr рдкреНрд░реЛрдореЛ рдХреЛрдб рдкреНрд░рдпреЛрдЧ рдЧрд░реА рдХреБрдиреИ рдкрдирд┐ Skillbox рдкрд╛рдареНрдпрдХреНрд░рдордорд╛ рднрд░реНрдирд╛ рдЧрд░реНрджрд╛ резреж,режрежреж рд░реВрдмрд▓ рдЫреБрдЯред

рдкреНрдпрд╛рдХреЗрдЬрд╣рд░реВ

рд╣рд╛рдореАрд▓рд╛рдИ R рдорд╛ рдкреНрдпрд╛рдХреЗрдЬрд╣рд░реВ рдЪрд╛рд╣рд┐рдиреНрдЫ:

рдпреА рджреБрдИ рдЕрддрд┐ рдЖрд╡рд╢реНрдпрдХ рдЫрдиреНред рдердк рд░реВрдкрдорд╛, tidyverse, рдЪреМрдХреАрджрд╛рд░ рд░ рддрд░рд╛рдЬреВ рдбрд╛рдЯрд╛ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рд╣реБрдиреЗрдЫ, array рд╕рдлрд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ рддрджрдиреБрд╕рд╛рд░ рдврд╛рдБрдЪрд╛ред

рдбрд╛рдЯрд╛

рд╣рд╛рдореАрд▓реЗ рдпрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдореВрд▓ рдбрд╛рдЯрд╛рд╕реЗрдЯ рд╡рд┐рд╢реНрд╡ рдмреИрдВрдХрдХреЛ рд╡реЗрдмрд╕рд╛рдЗрдЯрдмрд╛рдЯ рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░рд┐рдПрдХреЛ рдЫред рддрд┐рдиреАрд╣рд░реВ рдпрд╣рд╛рдБ рдЫрдиреН - рд╡рд┐рд╢реНрд╡ рдмреИрдВрдХ рдбрд╛рдЯрд╛ред рдПрдЙрдЯреИ рдбрд╛рдЯрд╛, рдпрджрд┐ рддрдкрд╛рдИрдВрд▓рд╛рдИ рдпреЛ рд░реЗрдбрд┐рдореЗрдб рдЪрд╛рд╣рд┐рдиреНрдЫ рднрдиреЗ, рдмрд╛рдЯ рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдлреЛрд▓реНрдбрд░рд╣рд░реВ.

рдпреЛ рдХрд╕реНрддреЛ рдкреНрд░рдХрд╛рд░рдХреЛ рдЬрд╛рдирдХрд╛рд░реА рд╣реЛ? рдирдореВрдирд╛рд▓реЗ рдзреЗрд░реИ рд╡рд░реНрд╖рд╣рд░реВ (реирежрежреж рджреЗрдЦрд┐ реирежрезрен рд╕рдореНрдо) рдзреЗрд░реИ рджреЗрд╢рд╣рд░реВрдХреЛ GDP рдорд╛рди рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫред

рдбрд╛рдЯрд╛ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ

рдЖрд╡рд╢реНрдпрдХ рдбрд╛рдЯрд╛ рдврд╛рдБрдЪрд╛ рддрдпрд╛рд░ рдЧрд░реНрди рд╣рд╛рдореА рддрд▓ рдкреЛрд╕реНрдЯ рдЧрд░рд┐рдПрдХреЛ рдХреЛрдб рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВред рд╣рд╛рдореА рд╕реНрддрдореНрднрдХреЛ рдирд╛рдорд╣рд░реВ рдЦрд╛рд▓реА рдЧрд░реНрдЫреМрдВ, рдирдореНрдмрд░рд╣рд░реВрд▓рд╛рдИ рдирдореНрдмрд░ рдврд╛рдБрдЪрд╛рдорд╛ рдмрджрд▓реНрдЫреМрдВ, рд░ 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 рд╕рд╣рд┐рдд рдЗрдЪреНрдЫрд┐рдд рдврд╛рдБрдЪрд╛рдорд╛ рдПрдирд┐рдореЗрд╕рди рд░реЗрдиреНрдбрд░ рдЧрд░реНрдиреБ рд╣реЛред

рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВ рд▓реЛрдб рдЧрд░реНрджреИ

  • рдкреБрд╕реНрддрдХрд╛рд▓рдп (рд╡реНрдпрд╡рд╕реНрдерд┐рдд)
  • рдкреБрд╕реНрддрдХрд╛рд▓рдп (рдЧреНрдЧрд╛рдирд┐рдореЗрдЯ)

рдбрд╛рдЯрд╛ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди

рдпрд╕ рдЪрд░рдгрдорд╛, рддрдкрд╛рдИрдВрд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрд╖рдХреЛ рд▓рд╛рдЧрд┐ рд╢реАрд░реНрд╖ 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()

рд╕реНрдерд┐рд░ рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдорд╣рд░реВ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрджреИ

рдЕрдм рд╣рд╛рдореАрд╕рдБрдЧ рдЖрд╡рд╢реНрдпрдХ рдврд╛рдБрдЪрд╛рдорд╛ рдбрд╛рдЯрд╛ рдкреНрдпрд╛рдХреЗрдЬ рдЫ, рд╣рд╛рдореА рд╕реНрдерд┐рд░ рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдорд╣рд░реВ рдХреЛрд░реНрди рд╕реБрд░реБ рдЧрд░реНрдЫреМрдВред рдЖрдзрд╛рд░рднреВрдд рдЬрд╛рдирдХрд╛рд░реА - рдЪрдпрди рдЧрд░рд┐рдПрдХреЛ рд╕рдордп рдЕрдиреНрддрд░рд╛рд▓рдХреЛ рд▓рд╛рдЧрд┐ рдЕрдзрд┐рдХрддрдо GDP рд╕рдВрдЧ рд╢реАрд░реНрд╖ 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 рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдкреНрд▓рдЯрд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдзреЗрд░реИ рд╕рд░рд▓ рдЫред рддрдкрд╛рдИрд▓реЗ рдорд╛рдерд┐рдХреЛ рдХреЛрдб рд╕реЗрдХреНрд╕рдирдорд╛ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдерд┐рдо() рдкреНрд░рдХрд╛рд░реНрдпрд╕рдБрдЧ рдзреЗрд░реИ рдореБрдЦреНрдп рдмрд┐рдиреНрджреБрд╣рд░реВ рдЫрдиреНред рддрд┐рдиреАрд╣рд░реВ рдЖрд╡рд╢реНрдпрдХ рдЫрдиреН рддрд╛рдХрд┐ рд╕рдмреИ рддрддреНрд╡рд╣рд░реВ рдмрд┐рдирд╛ рд╕рдорд╕реНрдпрд╛ рдПрдирд┐рдореЗрдЯ рд╣реБрдиреНрдЫрдиреНред рдЖрд╡рд╢реНрдпрдХ рднрдПрдорд╛ рддреА рдордзреНрдпреЗ рдХреЗрд╣реА рдкреНрд░рджрд░реНрд╢рди рдирд╣реБрди рд╕рдХреНрдЫред рдЙрджрд╛рд╣рд░рдг: рдард╛рдбреЛ рдЧреНрд░рд┐рдб рд░реЗрдЦрд╛рд╣рд░реВ рд░ рдХрдерд╛рд╣рд░реВ рдорд╛рддреНрд░ рдХреЛрд░рд┐рдПрдХрд╛ рдЫрдиреН, рддрд░ рдЕрдХреНрд╖ рд╢реАрд░реНрд╖рдХрд╣рд░реВ рд░ рдзреЗрд░реИ рдЕрдиреНрдп рдШрдЯрдХрд╣рд░реВ рдХреНрд╖реЗрддреНрд░рдмрд╛рдЯ рд╣рдЯрд╛рдЗрдПрдХрд╛ рдЫрдиреНред

рдПрдирд┐рдореЗрд╕рди

рдпрд╣рд╛рдБ рдореБрдЦреНрдп рдкреНрд░рдХрд╛рд░реНрдп 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")

рд░реЗрдиреНрдбрд░рд┐рдВрдЧ

рдПрдХ рдкрдЯрдХ рдПрдирд┐рдореЗрд╕рди рд╕рд┐рд░реНрдЬрдирд╛ рд░ рдПрдирд┐рдо рд╡рд╕реНрддреБрдорд╛ рднрдгреНрдбрд╛рд░рдг рднрдПрдкрдЫрд┐, рдпреЛ рдПрдирд┐рдореЗрдЯ() рдкреНрд░рдХрд╛рд░реНрдп рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд░реЗрдиреНрдбрд░ рдЧрд░реНрдиреЗ рд╕рдордп рд╣реЛред 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 )

рдкрд░рд┐рдгрд╛рдо

рдЖрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдПрдирд┐рдореЗрдЯреЗрдб рд╣рд┐рд╕реНрдЯреЛрдЧреНрд░рд╛рдорд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН

рддрдкрд╛рдИрдВ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдХреЗрд╣рд┐ рдЬрдЯрд┐рд▓ рдЫреИрдиред рд╕рдореНрдкреВрд░реНрдг рдкрд░рд┐рдпреЛрдЬрдирд╛ рдорд╛ рдЙрдкрд▓рдмреНрдз рдЫ рдореЗрд░реЛ GitHub, рддрдкрд╛рдИрдВ рдпрд╕рд▓рд╛рдИ рдЙрдкрдпреБрдХреНрдд рджреЗрдЦреНрдиреБрд╣реБрдиреНрдЫ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

Skillbox рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрджрдЫ:

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди