
Geanimeerde histogrammen die rechtstreeks in publicaties op elke website kunnen worden ingebed, worden steeds populairder. Ze tonen de dynamiek van veranderingen in verschillende kenmerken over een bepaalde tijd en doen dit op een visuele manier. Laten we eens kijken hoe we ze kunnen maken met R en universele pakketten.
Skillbox raadt aan: Praktische cursus .
Ter herinnering: voor alle lezers van «Habr» — een korting van 10.000 roebel bij inschrijving voor elke cursus van Skillbox met de promocode «Habr».
Pakketten
We hebben de volgende pakketten in R nodig:
- ggplot2
Deze twee zijn absoluut noodzakelijk. Bovendien zijn tidyverse, janitor en scales nodig voor data-analyse, het opschonen van data en opmaak respectievelijk.
Gegevens
De originele dataset die we voor dit project zullen gebruiken, wordt gedownload van de website van de Wereldbank. Hier zijn ze — . Diezelfde gegevens, als je ze in een kant-en-klaar formaat nodig hebt, kunnen worden gedownload uit de .
Wat voor informatie is dit? De dataset bevat het BBP van de meeste landen over meerdere jaren (van 2000 tot 2017).
Gegevensverwerking
We zullen de onderstaande code gebruiken om het benodigde dataformaat voor te bereiden. We reinigen de kolomnamen, zetten getallen om in numeriek formaat en converteren de gegevens met de functie gather(). Alles wat we krijgen, slaan we op in gdp_tidy.csv voor toekomstig gebruik.
bibliotheek(tidyverse)
bibliotheek(janitor)
gdp <- read_csv("./data/GDP_Data.csv")
#select required columns
gdp % select(3:15)
#filter only country rows
gdp <- gdp[1:217,]
gdp_tidy %
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 histogrammen
Hun creatie vereist twee stappen:
- Het bouwen van een complete set actuele histogrammen met behulp van ggplot2.
- Het animeren van statische histogrammen met de gewenste parameters met behulp van gganimate.
De laatste stap is het renderen van de animatie in het gewenste formaat, inclusief GIF of MP4.
Bibliotheken laden
- bibliotheek(tidyverse)
- library(gganimate)
Gegevensbeheer
In deze stap moeten we de gegevens filteren om de top 10 landen van elk jaar te verkrijgen. We voegen enkele kolommen toe die de legende voor het histogram kunnen weergeven.
gdp_tidy <- read_csv("./data/gdp_tidy.csv")
gdp_formatted %
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 %
ungroup()
Bouwen van statische histogrammen
Nu we een gegevenspakket in het juiste formaat hebben, beginnen we met het tekenen van statische histogrammen. Basisinformatie - de top 10 landen met het hoogste BBP over de gekozen periode. We creëren grafieken voor elk 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"))
Het is heel eenvoudig om grafieken te maken met ggplot2. Zoals je kunt zien in het bovenstaande codefragment, zijn er verschillende belangrijke punten met de functie theme(). Deze zijn noodzakelijk zodat alle elementen probleemloos worden geanimeerd. Sommige van hen kunnen indien nodig niet worden weergegeven. Bijvoorbeeld: alleen de verticale rasterlijnen en legenden worden getekend, terwijl de assenlabels en nog een aantal componenten uit het gedeelte worden verwijderd.
Animatie
De sleutel functie hier is transition_states(), die afzonderlijke statische grafieken aan elkaar plakt. view_follow() wordt gebruikt om de rasterlijnen te tekenen.
anim = staticplot + transition_states(jaar, transition_length = 4, state_length = 1) +
view_follow(fixed_x = TRUE) +
labs(titel = 'BBP per Jaar : {closest_state}',
subtitel = "Top 10 Landen",
caption = "BBP in Miljarden USD | Gegevensbron: Wereldbank Gegevens")
Rendering
Wanneer de animatie is gemaakt en opgeslagen in het object anim, is het tijd om deze te visualiseren met de functie animate(). De renderer die gebruikt wordt in animate() kan variëren afhankelijk van het type uitvoerbestand dat nodig is.
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 )
Resultaat

Zoals we zien, is er niets ingewikkelds. Het hele project is beschikbaar op , je kunt het gebruiken zoals je dat wilt.
Skillbox raadt aan:
- Praktische tweejarenopleiding .
- Online cursus .
- Praktische jaaropleiding .
Bron: habr.com
