Skep geanimeerde histogramme met behulp van R

Skep geanimeerde histogramme met behulp van R

Geanimeerde staafgrafieke wat direk in 'n plasing op enige webwerf ingebed kan word, word al hoe meer gewild. Hulle vertoon die dinamika van veranderinge in enige kenmerke oor 'n sekere tyd en doen dit duidelik. Kom ons kyk hoe om dit te skep met behulp van R en generiese pakkette.

Skillbox beveel aan: Praktiese kursus "Python-ontwikkelaar van nuuts af".

Ons herinner: vir alle lesers van "Habr" - 'n afslag van 10 000 roebels wanneer u inskryf vir enige Skillbox-kursus met behulp van die "Habr"-promosiekode.

pakkette

Ons benodig pakkette in R:

Hierdie twee is uiters noodsaaklik. Boonop sal netjies, oppas en skale vereis word om die data te bestuur, die skikking skoon te maak en dienooreenkomstig te formateer.

Data

Die oorspronklike datastel wat ons in hierdie projek gaan gebruik, word van die WΓͺreldbank se webwerf afgelaai. Hier is hulle - WΓͺreldbank data. Dieselfde data, as jy dit gereed gemaak het, kan afgelaai word vanaf projek dopgehou.

Watter soort inligting is dit? Die steekproef bevat die BBP-waarde van die meeste lande vir etlike jare (van 2000 tot 2017).

Data verwerking

Ons sal die kode hieronder gebruik om die vereiste dataformaat voor te berei. Ons maak die kolomname skoon, verander die getalle in 'n getalformaat en skakel die data om deur die versamel()-funksie te gebruik. Ons stoor alles wat in gdp_tidy.csv ontvang word vir verdere gebruik.

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")

Geanimeerde histogramme

Hul skepping vereis twee fases:

  • Die plot van 'n volledige stel werklike histogramme met behulp van ggplot2.
  • Animeer statiese histogramme met gewenste parameters met behulp van gganimate.

Die laaste stap is om die animasie in die verlangde formaat weer te gee, insluitend GIF of MP4.

Laai biblioteke

  • biblioteek (tidyverse)
  • biblioteek (gganimate)

Databestuur

In hierdie stap moet jy die data filter om die top 10 lande vir elke jaar te kry. Kom ons voeg verskeie kolomme by wat ons sal toelaat om 'n legende vir die histogram te vertoon.

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()

Bou statiese histogramme

Noudat ons 'n datapakket in die vereiste formaat het, begin ons statiese histogramme teken. Basiese inligting - top 10 lande met maksimum BBP vir die geselekteerde tydsinterval. Ons skep grafieke vir elke jaar.

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"))

Die skep van plotte met behulp van ggplot2 is baie eenvoudig. Soos u in die kode-afdeling hierbo kan sien, is daar verskeie sleutelpunte met die theme()-funksie. Hulle is nodig sodat alle elemente sonder probleme animeer. Sommige van hulle sal dalk nie vertoon word indien nodig nie. Voorbeeld: Slegs die vertikale roosterlyne en legendes word geteken, maar die astitels en verskeie ander komponente word uit die area verwyder.

animasie

Die sleutelfunksie hier is transition_states(), dit steek afsonderlike statiese grafieke saam. view_follow() word gebruik om roosterlyne te teken.

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")

Lewer

Sodra die animasie geskep en in die anim-voorwerp gestoor is, is dit tyd om dit weer te gee deur die animate()-funksie te gebruik. Die weergawe wat in animate() gebruik word, kan verskil afhangende van die tipe uitvoerlΓͺer wat benodig word.

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 )

Gevolg

Skep geanimeerde histogramme met behulp van R

Soos jy kan sien, niks ingewikkeld nie. Die hele projek is beskikbaar in my GitHub, jy kan dit gebruik soos jy goeddink.

Skillbox beveel aan:

Bron: will.com

Voeg 'n opmerking