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

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

рдПрдирд┐рдореЗрдЯреЗрдб рдмрд╛рд░ рдЪрд╛рд░реНрдЯ рдЬрд┐рдиреНрд╣реЗрдВ рдХрд┐рд╕реА рднреА рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рд╕реАрдзреЗ рдкреЛрд╕реНрдЯ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЗрдЬреА рд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реЛ рд░рд╣реЗ рд╣реИрдВред рд╡реЗ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдордп рдореЗрдВ рдХрд┐рд╕реА рднреА рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреА рдЧрддрд┐рд╢реАрд▓рддрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд░рддреЗ рд╣реИрдВред рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдЖрд░ рдФрд░ рдЬреЗрдиреЗрд░рд┐рдХ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред

рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реИ: рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдкрд╛рдареНрдпрдХреНрд░рдо "рд╢реБрд░реБрдЖрдд рд╕реЗ рдкрд╛рдпрдерди рдбреЗрд╡рд▓рдкрд░".

рдЕрдиреБрд╕реНрдорд╛рд░рдХ: "рд╣реИрдмрд░" рдХреЗ рд╕рднреА рдкрд╛рдардХреЛрдВ рдХреЗ рд▓рд┐рдП - "рд╣реИрдмрд░" рдкреНрд░рдЪрд╛рд░ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рд╕реА рднреА рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдкрд╛рдареНрдпрдХреНрд░рдо рдореЗрдВ рдирд╛рдорд╛рдВрдХрди рдХрд░рддреЗ рд╕рдордп 10 рд░реВрдмрд▓ рдХреА рдЫреВрдЯред

рд╕рдВрдХреБрд▓

рд╣рдореЗрдВ R рдореЗрдВ рдкреИрдХреЗрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

рдпреЗ рджреЛрдиреЛрдВ рдмреЗрд╣рдж рдЬрд░реВрд░реА рд╣реИрдВ. рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдбреЗрдЯрд╛ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ, рд╕рд░рдгреА рдХреЛ рд╕рд╛рдл рдХрд░рдиреЗ рдФрд░ рддрджрдиреБрд╕рд╛рд░ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЯрд┐рдбреАрд╡рд░реНрд╕, рдЪреМрдХреАрджрд╛рд░ рдФрд░ рд╕реНрдХреЗрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред

рдбреЗрдЯрд╛

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

рдпрд╣ рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛рдирдХрд╛рд░реА рд╣реИ? рдирдореВрдиреЗ рдореЗрдВ рдХрдИ рд╡рд░реНрд╖реЛрдВ (2000 рд╕реЗ 2017 рддрдХ) рдХреЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рджреЗрд╢реЛрдВ рдХрд╛ рд╕рдХрд▓ рдШрд░реЗрд▓реВ рдЙрддреНрдкрд╛рдж рдореВрд▓реНрдп рд╢рд╛рдорд┐рд▓ рд╣реИред

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

рд╣рдо рдЖрд╡рд╢реНрдпрдХ рдбреЗрдЯрд╛ рдкреНрд░рд╛рд░реВрдк рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдкреЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╣рдо рдХреЙрд▓рдо рдирд╛рдо рд╕рд╛рдлрд╝ рдХрд░рддреЗ рд╣реИрдВ, рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреЛ рд╕рдВрдЦреНрдпрд╛ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ, рдФрд░ рдЗрдХрдЯреНрдард╛ () рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЖрдЧреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП 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 рд╕рд╣рд┐рдд рд╡рд╛рдВрдЫрд┐рдд рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ рд╣реИред

рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝ рд▓реЛрдб рд╣реЛ рд░рд╣реА рд╣реИрдВ

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

рдПрдиреАрдореЗрд╢рди

рдпрд╣рд╛рдВ рдореБрдЦреНрдп рдХрд╛рд░реНрдп рдЯреНрд░рд╛рдВрдЬрд╝рд┐рд╢рди_рд╕реНрдЯреЗрдЯреНрд╕() рд╣реИ, рдпрд╣ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реНрдерд┐рд░ рдЧреНрд░рд╛рдлрд╝ рдХреЛ рдПрдХ рд╕рд╛рде рдЬреЛрдбрд╝рддрд╛ рд╣реИред 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")

рдкреНрд░рддрд┐рдкрд╛рджрди

рдПрдХ рдмрд╛рд░ рдЬрдм рдПрдиреАрдореЗрд╢рди рдмрди рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдПрдиреАрдореЗрд╢рди рдСрдмреНрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдПрдирд┐рдореЗрдЯ() рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рдЖ рдЬрд╛рддрд╛ рд╣реИред рдПрдирд┐рдореЗрдЯ() рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рд░реЗрдВрдбрд░рд░ рдЖрд╡рд╢реНрдпрдХ рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рд╛рдЗрд▓ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

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 )

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

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

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

рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реИ:

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╝реЗрдВ