Maak geanimeerde histogrammen met R

Maak geanimeerde histogrammen met R

Geanimeerde staafdiagrammen die rechtstreeks in een bericht op elke website kunnen worden ingesloten, worden steeds populairder. Ze geven de dynamiek van veranderingen in alle kenmerken gedurende een bepaalde tijd weer en doen dit duidelijk. Laten we eens kijken hoe we ze kunnen maken met R en generieke pakketten.

Skillbox beveelt aan: Praktische cursus "Python-ontwikkelaar vanaf nul".

Herinnering: voor alle lezers van "Habr" - een korting van 10 roebel bij inschrijving voor een Skillbox-cursus met behulp van de promotiecode "Habr".

Pakketjes

We hebben pakketten nodig in R:

Deze twee zijn uiterst noodzakelijk. Bovendien zijn er een schoonmaakster, een conciΓ«rge en een weegschaal nodig om de gegevens te beheren, de array op te schonen en dienovereenkomstig te formatteren.

Gegevens

De originele dataset die we in dit project zullen gebruiken, wordt gedownload van de website van de Wereldbank. Daar zijn ze - Gegevens van de Wereldbank. Dezelfde gegevens, als u deze kant-en-klaar nodig heeft, kunt u downloaden via projectmappen.

Wat voor soort informatie is dit? De steekproef bevat de bbp-waarde van de meeste landen voor meerdere jaren (van 2000 tot 2017).

Gegevensverwerking

We zullen de onderstaande code gebruiken om het vereiste gegevensformaat voor te bereiden. We wissen de kolomnamen, zetten de getallen om in een getalnotatie en converteren de gegevens met behulp van de functie collect(). Alles wat binnenkomt bewaren we in gdp_tidy.csv voor verder 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 histogrammen

Hun creatie vereist twee fasen:

  • Een complete set feitelijke histogrammen plotten met behulp van ggplot2.
  • Animeer 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)
  • bibliotheek(geanimeerd)

Gegevensbeheer

In deze stap moet u de gegevens filteren om de top 10 van landen voor elk jaar te verkrijgen. Laten we verschillende kolommen toevoegen waarmee we een legenda voor het histogram kunnen weergeven.

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

Statische histogrammen maken

Nu we een gegevenspakket in het vereiste formaat hebben, beginnen we met het tekenen van statische histogrammen. Basisinformatie - top 10 landen met maximaal BBP voor het geselecteerde tijdsinterval. Voor elk jaar maken we grafieken.

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 maken van plots met ggplot2 is heel eenvoudig. Zoals je in het codegedeelte hierboven kunt zien, zijn er verschillende belangrijke punten met de functie thema(). Ze zijn nodig zodat alle elementen zonder problemen animeren. Sommige ervan worden indien nodig mogelijk niet weergegeven. Voorbeeld: Alleen de verticale rasterlijnen en legenda's worden getekend, maar de astitels en verschillende andere componenten worden uit het gebied verwijderd.

animatie

De sleutelfunctie hier is transition_states(), het voegt afzonderlijke statische grafieken samen. view_follow() wordt gebruikt om rasterlijnen te tekenen.

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

Renderen

Zodra de animatie is gemaakt en opgeslagen in het anim-object, is het tijd om deze weer te geven met de functie animate(). De renderer die in animate() wordt gebruikt, kan verschillen, afhankelijk van het vereiste type uitvoerbestand.

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

Maak geanimeerde histogrammen met R

Zoals je kunt zien, niets ingewikkelds. Het gehele project is beschikbaar in mijn GitHub, je kunt het gebruiken zoals je wilt.

Skillbox beveelt aan:

Bron: www.habr.com

Voeg een reactie