ืฆื•ืจ ื”ื™ืกื˜ื•ื’ืจืžื•ืช ืžื•ื ืคืฉื•ืช ื‘ืืžืฆืขื•ืช R

ืฆื•ืจ ื”ื™ืกื˜ื•ื’ืจืžื•ืช ืžื•ื ืคืฉื•ืช ื‘ืืžืฆืขื•ืช R

ืชืจืฉื™ืžื™ ืขืžื•ื“ื•ืช ืžื•ื ืคืฉื™ื ืฉื ื™ืชืŸ ืœื”ื˜ืžื™ืข ื™ืฉื™ืจื•ืช ื‘ืคื•ืกื˜ ื‘ื›ืœ ืืชืจ ื”ื•ืคื›ื™ื ืคื•ืคื•ืœืจื™ื™ื ื™ื•ืชืจ ื•ื™ื•ืชืจ. ื”ื ืžืฆื™ื’ื™ื ืืช ื”ื“ื™ื ืžื™ืงื” ืฉืœ ืฉื™ื ื•ื™ื™ื ื‘ื›ืœ ืžืืคื™ื™ื ื™ื ืœืื•ืจืš ื–ืžืŸ ืžืกื•ื™ื ื•ืขื•ืฉื™ื ื–ืืช ื‘ื‘ื™ืจื•ืจ. ื‘ื•ืื• ื ืจืื” ื›ื™ืฆื“ ืœื™ืฆื•ืจ ืื•ืชื ื‘ืืžืฆืขื•ืช R ื•ื—ื‘ื™ืœื•ืช ื’ื ืจื™ื•ืช.

Skillbox ืžืžืœื™ืฆื”: ืงื•ืจืก ืžืขืฉื™ "ืžืคืชื— Python ืžืืคืก".

ืื ื• ืžื–ื›ื™ืจื™ื: ืœื›ืœ ืงื•ืจืื™ Habr - ื”ื ื—ื” ืฉืœ 10 ืจื•ื‘ืœ ื‘ืขืช ื”ืจืฉืžื” ืœื›ืœ ืงื•ืจืก Skillbox ื‘ืืžืฆืขื•ืช ืงื•ื“ ื”ื”ื˜ื‘ื” ืฉืœ Habr.

ื—ื‘ื™ืœื•ืช

ืื ื—ื ื• ืฆืจื™ื›ื™ื ื—ื‘ื™ืœื•ืช ื‘-R:

ืฉื ื™ ืืœื” ื ื—ื•ืฆื™ื ื‘ื™ื•ืชืจ. ื‘ื ื•ืกืฃ, ื™ื™ื“ืจืฉื• tidyverse, ืฉืจืช ื•ืžืื–ื ื™ื™ื ืœื ื™ื”ื•ืœ ื”ื ืชื•ื ื™ื, ื ื™ืงื•ื™ ื”ืžืขืจืš ื•ืคืจืžื•ื˜ ื‘ื”ืชืื.

ื ืชื•ื ื™ื

ืžืขืจืš ื”ื ืชื•ื ื™ื ื”ืžืงื•ืจื™ ื‘ื• ื ืฉืชืžืฉ ื‘ืคืจื•ื™ืงื˜ ื–ื” ืžื•ื•ืจื“ ืžืืชืจ ื”ื‘ื ืง ื”ืขื•ืœืžื™. ื”ื ื” ื”ื - ื ืชื•ื ื™ ื”ื‘ื ืง ื”ืขื•ืœืžื™. ืืช ืื•ืชื ื ืชื•ื ื™ื, ืื ืืชื” ืฆืจื™ืš ืื•ืชื ืžื•ื›ื ื™ื, ื ื™ืชืŸ ืœื”ื•ืจื™ื“ ืž ืชื™ืงื™ื•ืช ืคืจื•ื™ืงื˜.

ืื™ื–ื” ืกื•ื’ ืžื™ื“ืข ื–ื”? ื”ืžื“ื’ื ืžื›ื™ืœ ืืช ืขืจืš ื”ืชืž"ื’ ืฉืœ ืจื•ื‘ ื”ืžื“ื™ื ื•ืช ืœืžืกืคืจ ืฉื ื™ื (ืž-2000 ืขื“ 2017).

ืขื™ื‘ื•ื“ ื ืชื•ื ื™ื

ืื ื• ื ืฉืชืžืฉ ื‘ืงื•ื“ ืฉืคื•ืจืกื ืœืžื˜ื” ื›ื“ื™ ืœื”ื›ื™ืŸ ืืช ืคื•ืจืžื˜ ื”ื ืชื•ื ื™ื ื”ื ื“ืจืฉ. ืื ื• ืžื ืงื™ื ืืช ืฉืžื•ืช ื”ืขืžื•ื“ื•ืช, ื”ื•ืคื›ื™ื ืืช ื”ืžืกืคืจื™ื ืœืคื•ืจืžื˜ ืžืกืคืจื™ื ื•ืžืžื™ืจื™ื ืืช ื”ื ืชื•ื ื™ื ื‘ืืžืฆืขื•ืช ื”ืคื•ื ืงืฆื™ื” 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.

ื˜ื•ืขืŸ ืกืคืจื™ื•ืช

  • ืกืคืจื™ื™ื” (ืžืกื•ื“ืจื™ื)
  • library(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")

ื˜ึดื™ื•ึผื—ึท

ืœืื—ืจ ื™ืฆื™ืจืช ื”ืื ื™ืžืฆื™ื” ื•ืžืื•ื—ืกื ืช ื‘ืื•ื‘ื™ื™ืงื˜ ื”ืื ื™ืžืฆื™ื”, ื”ื’ื™ืข ื”ื–ืžืŸ ืœืจื ื“ืจ ืื•ืชื” ื‘ืืžืฆืขื•ืช ื”ืคื•ื ืงืฆื™ื” 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

ื”ื•ืกืคืช ืชื’ื•ื‘ื”