We creëren geanimeerde histogrammen met behulp van R.

We creëren geanimeerde histogrammen met behulp van R.

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 «Python-ontwikkelaar vanaf nul».

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:

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 — WorldBank Data. Diezelfde gegevens, als je ze in een kant-en-klaar formaat nodig hebt, kunnen worden gedownload uit de projectmap.

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

We creëren geanimeerde histogrammen met behulp van R.

Zoals we zien, is er niets ingewikkelds. Het hele project is beschikbaar op mijn GitHub, je kunt het gebruiken zoals je dat wilt.

Skillbox raadt aan:

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers 🔥 Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster