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

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

рдЕреЕрдирд┐рдореЗрдЯреЗрдб рдмрд╛рд░ рдЪрд╛рд░реНрдЯ рдЬреЗ рдХреЛрдгрддреНрдпрд╛рд╣реА рд╡реЗрдмрд╕рд╛рдЗрдЯрд╡рд░реАрд▓ рдкреЛрд╕реНрдЯрдордзреНрдпреЗ рдереЗрдЯ рдПрдореНрдмреЗрдб рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд рддреЗ рдЕрдзрд┐рдХ рд▓реЛрдХрдкреНрд░рд┐рдп рд╣реЛрдд рдЖрд╣реЗрдд. рддреЗ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╡реЗрд│реЗрдд рдХреЛрдгрддреНрдпрд╛рд╣реА рд╡реИрд╢рд┐рд╖реНрдЯреНрдпрд╛рдВрдордзреАрд▓ рдмрджрд▓рд╛рдВрдЪреА рдЧрддрд┐рд╢реАрд▓рддрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛рдд рдЖрдгрд┐ рд╣реЗ рд╕реНрдкрд╖реНрдЯрдкрдгреЗ рдХрд░рддрд╛рдд. R рдЖрдгрд┐ рдЬреЗрдиреЗрд░рд┐рдХ рдкреЕрдХреЗрдЬреЗрд╕ рд╡рд╛рдкрд░реВрди рддреЗ рдХрд╕реЗ рддрдпрд╛рд░ рдХрд░рд╛рдпрдЪреЗ рддреЗ рдкрд╛рд╣реВ.

рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рддреЛ: рдкреНрд░реЕрдХреНрдЯрд┐рдХрд▓ рдХреЛрд░реНрд╕ "рдкрд╛рдпрдерди рд╡рд┐рдХрд╕рдХ рд╕реБрд░рд╡рд╛рддреАрдкрд╛рд╕реВрди".

рдЖрдореНрд╣реА рдЖрдард╡рдг рдХрд░реВрди рджреЗрддреЛ: рд╕рд░реНрд╡ Habr рд╡рд╛рдЪрдХрд╛рдВрд╕рд╛рдареА - Habr рдкреНрд░реЛрдореЛ рдХреЛрдб рд╡рд╛рдкрд░реВрди рдХреЛрдгрддреНрдпрд╛рд╣реА рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рдХреЛрд░реНрд╕рдордзреНрдпреЗ рдирд╛рд╡рдиреЛрдВрджрдгреА рдХрд░рддрд╛рдирд╛ 10 рд░реВрдмрд▓ рд╕рд╡рд▓рдд.

рдкреЕрдХреЗрдЯ

рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрд░ рдордзреНрдпреЗ рдкреЕрдХреЗрдЬреЗрд╕рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ:

рд╣реЗ рджреЛрдиреНрд╣реА рдЕрддреНрдпрдВрдд рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗрдд. рдпрд╛рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рдбреЗрдЯрд╛ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЕреЕрд░реЗ рд╕рд╛рдл рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдгрд┐ рддреНрдпрд╛рдиреБрд╕рд╛рд░ рд╕реНрд╡рд░реВрдкрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА tidyverse, janitor рдЖрдгрд┐ scals рдЖрд╡рд╢реНрдпрдХ рдЕрд╕рддреАрд▓.

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

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

рд╣реА рдХреЛрдгрддреНрдпрд╛ рдкреНрд░рдХрд╛рд░рдЪреА рдорд╛рд╣рд┐рддреА рдЖрд╣реЗ? рдирдореБрдиреНрдпрд╛рдд рдЕрдиреЗрдХ рд╡рд░реНрд╖рд╛рдВрдЪреЗ (2000 рддреЗ 2017 рдкрд░реНрдпрдВрдд) рдмрд╣реБрддреЗрдХ рджреЗрд╢рд╛рдВрдЪреЗ 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() рдордзреНрдпреЗ рд╡рд╛рдкрд░рд▓реЗрд▓рд╛ рдкреНрд░рд╕реНрддреБрддрдХрд░реНрддрд╛ рдЖрд╡рд╢реНрдпрдХ рдЖрдЙрдЯрдкреБрдЯ рдлрд╛рдЗрд▓рдЪреНрдпрд╛ рдкреНрд░рдХрд╛рд░рд╛рдиреБрд╕рд╛рд░ рднрд┐рдиреНрди рдЕрд╕реВ рд╢рдХрддреЛ.

рдЬреАрдЖрдпрдПрдл

# 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, рддреБрдореНрд╣рд╛рд▓рд╛ рдпреЛрдЧреНрдп рд╡рд╛рдЯреЗрд▓ рддрд╕реЗ рддреБрдореНрд╣реА рддреЗ рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛.

рд╕реНрдХрд┐рд▓рдмреЙрдХреНрд╕ рд╢рд┐рдлрд╛рд░рд╕ рдХрд░рддреЛ:

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛