Créer des histogrammes animés à l'aide de R

Créer des histogrammes animés à l'aide de R

Les graphiques à barres animés qui peuvent être intégrés directement dans une publication sur n'importe quel site Web sont de plus en plus populaires. Ils affichent la dynamique des changements de caractéristiques sur une certaine période et le font clairement. Voyons comment les créer à l'aide de R et de packages génériques.

Skillbox vous recommande : Cours pratique "Développeur Python à partir de zéro".

Nous rappelons: pour tous les lecteurs de "Habr" - une remise de 10 000 roubles lors de l'inscription à n'importe quel cours Skillbox en utilisant le code promotionnel "Habr".

Forfaits

Nous avons besoin de packages dans R :

Ces deux-là sont extrêmement nécessaires. De plus, Tidyverse, concierge et balances seront nécessaires pour gérer les données, nettoyer le tableau et le formater en conséquence.

Données

L'ensemble de données original que nous utiliserons dans ce projet est téléchargé à partir du site Web de la Banque mondiale. Les voici - Données de la Banque mondiale. Les mêmes données, si vous en avez besoin toutes faites, peuvent être téléchargées depuis dossiers de projet.

De quel genre d’informations s’agit-il ? L'échantillon contient la valeur du PIB de la plupart des pays sur plusieurs années (de 2000 à 2017).

Traitement des données

Nous utiliserons le code affiché ci-dessous pour préparer le format de données requis. Nous effaçons les noms de colonnes, transformons les nombres en format numérique et convertissons les données à l'aide de la fonction rassembler(). Nous sauvegardons tout ce qui est reçu dans gdp_tidy.csv pour une utilisation ultérieure.

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

Histogrammes animés

Leur création nécessite deux étapes :

  • Tracer un ensemble complet d'histogrammes réels à l'aide de ggplot2.
  • Animez des histogrammes statiques avec les paramètres souhaités à l'aide de gganimate.

La dernière étape consiste à restituer l'animation au format souhaité, notamment GIF ou MP4.

Chargement des bibliothèques

  • bibliothèque (tidyverse)
  • bibliothèque (ganimer)

Gestion de données

Dans cette étape, vous devez filtrer les données pour obtenir les 10 premiers pays pour chaque année. Ajoutons plusieurs colonnes qui nous permettront d'afficher une légende pour l'histogramme.

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

Construire des histogrammes statiques

Maintenant que nous disposons d’un ensemble de données au format requis, nous commençons à dessiner des histogrammes statiques. Informations de base - 10 principaux pays avec un PIB maximum pour l'intervalle de temps sélectionné. Nous créons des graphiques pour chaque année.

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

Créer des tracés à l'aide de ggplot2 est très simple. Comme vous pouvez le voir dans la section de code ci-dessus, la fonction theme() présente plusieurs points clés. Ils sont nécessaires pour que tous les éléments s'animent sans problème. Certains d'entre eux peuvent ne pas être affichés si nécessaire. Exemple : seules les lignes de grille verticales et les légendes sont dessinées, mais les titres des axes et plusieurs autres composants sont supprimés de la zone.

Animation

La fonction clé ici est transition_states(), elle assemble des graphiques statiques séparés. view_follow() est utilisé pour tracer des lignes de grille.

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

Le rendu

Une fois l'animation créée et stockée dans l'objet anim, il est temps de la restituer à l'aide de la fonction animate(). Le moteur de rendu utilisé dans animate() peut être différent selon le type de fichier de sortie requis.

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ésultat

Créer des histogrammes animés à l'aide de R

Comme vous pouvez le constater, rien de compliqué. L'ensemble du projet est disponible en mon GitHub, vous pouvez l’utiliser comme bon vous semble.

Skillbox vous recommande :

Source: habr.com

Ajouter un commentaire