Se rendre au contenu

Animation avec gganimate

gganimate étend la syntaxe des graphiques implémentée par ggplot2 pour y inclure la description de l'animation. Pour ce faire, il fournit une série de nouvelles fonctions qui peuvent être ajoutées à l'objet "plot" afin de personnaliser la façon dont il doit évoluer dans le temps.

  • transition_*() : définit la façon dont les données doivent être réparties et comment elles se rapportent à elles-mêmes dans le temps.
  • view_*() : définit comment les échelles de position doivent changer au cours de l'animation.
  • shadow_*() : définit comment les données d'autres points dans le temps doivent être présentées au point donné dans le temps.
  • enter_*() / exit_*() : définit comment les nouvelles données doivent apparaître et comment les anciennes données doivent disparaître au cours de l'animation. ease_aes() définit comment les différents aspects esthétiques doivent être atténués pendant les transitions.

En combinant ces nouvelles fonctions, on arrive à donner une dimension supplémentaire à notre graphique. Une feuille récapitulative permet de comprendre comment s'utilise la bibliothèque.

Données

library(dplyr)
library(ggplot2)

theme_set(theme_minimal())

data = read.csv('data/continents.csv', stringsAsFactors = TRUE)

head(data)
summary(data)
##      Country        Year        Population       
##  Afrique :72   Min.   :1950   Min.   :2.275e+08  
##  Amérique:72   1st Qu.:1968   1st Qu.:5.863e+08  
##  Asie    :72   Median :1986   Median :7.302e+08  
##  Europe  :72   Mean   :1986   Mean   :1.246e+09  
##                3rd Qu.:2003   3rd Qu.:1.383e+09  
##                Max.   :2021   Max.   :4.695e+09
  

Barplot

Animons ce graphique :

data %>%
  filter(Year == 2021) %>%
  ggplot(aes(x = Country, weight = Population)) +
  geom_bar(fill = "#00a67d")
Barplot

Pour cela, nous avons besoins des bibliothèques gganimate, ggforce et gifski. Une fois installées, redémarrez R.

Evolution

Pour animer, ajoutons une fonction de transition sur l'année à notre objet ggplot.

library(gganimate)
library(ggforce)

a = data %>%
  ggplot(aes(x = Country, weight = Population)) +
  geom_bar(fill = "#00a67d") +
  transition_time(Year)

animate(a, nframes = length(unique(data$Year)))

anim_save(filename = "bar_evolution.gif")
Animation

Ajoutons d'autres éléments à notre gif, tel que :

  • Un label
  • Un titre évolutif
# Ajoutons un label à nos données
data = data %>%
  mutate(Label = paste(as.character(round(Population/1000000)), "M"))

# Préparation du graphique ggplot
a = data %>%
  ggplot(aes(x = Country, weight = Population)) +
  geom_bar(fill = "#00a67d") +
  labs(title = 'Population Mondiale {frame_time}') + # Permet au titre d'être dynamique
  scale_y_continuous(labels = function(x) paste(x/1000000000, "Md"), limits = c(0, 4800000000)) + 
  geom_text(aes(label=Label, y=Population), size = 5, vjust = -.8) + # Ajout du label sur les barres
  transition_time(Year)

# Contrôlons quelques paramètres de rendu supplémentaires
animate(a, nframes = length(unique(data$Year)), fps = 12, width = 1280, height = 720, end_pause = 12)

anim_save(filename = "bar_evolution.gif")
Barplot et Titre evolutif

Courbe

transition_reveal

btc_data = read.csv('data/bitcoins.csv', sep = ';') %>%
  mutate(jour = as.Date(jour))

STEP = length(btc_data[,1])

format_dollars = function(x){
  return(paste("    ", format(x, big.mark = ','), "$"))
}

a = btc_data %>%
  ggplot(aes(x = jour, y = prix)) +
  geom_line(color = "steelblue", linewidth = 1) +
  geom_point(color = "steelblue", size = 2) +
  scale_y_continuous(labels = format_dollars) +
  transition_reveal(jour) +
  view_follow()

animate(a, nframes = round(60+STEP/6), fps = 24, width = 1280, height = 720, end_pause = 60)
anim_save(filename = "line_evolution.gif")
Bitcoin Evolution