Annexe A — Techniques de programmation pour la visualisation

Cette annexe décrit plusieurs techniques de programmation R utiles dans la création des animints.

A.1 Facettes économes en espace

Pour mettre l’accent sur les données graphiques dans les ggplots à facettes, éliminez l’espace entre les facettes à l’aide du code suivant :

ggplot()+
  geom_point(aes(Petal.Width, Sepal.Width), iris)+
  theme_bw()+
  theme(panel.margin=grid::unit(0, "lines"))+
  facet_grid(. ~ Species)

Ce code comprend trois parties :

  • panel.margin=0 élimine l’espace entre les panneaux.
  • theme_bw active un thème noir et blanc (bordures de panneaux noires et arrière-plans de panneaux blancs), ce qui rend visibles les limites entre les panneaux, une étape nécessaire, puisque la fonction par défaut de ggplot theme_grey utilise des fonds de panneaux gris et pas de bordures de panneaux.
  • facet_* crée un ggplot multipanneaux.

Notez que nous utilisons l’unité de grille lines, qui correspond à la hauteur d’une ligne de texte de la taille par défaut. C’est la seule unité de grille qu’animint sait traduire. L’utilisation d’autres unités telles que cm n’est pas recommandée.

A.2 Liste de tableaux de données

Les tableaux de données sont très utiles pour créer des visualisations de données interactives, quelle que soit leur complexité. Leur structure générale est la suivante :

library(data.table)
outer.data.list <- list()
inner.data.list <- list()
for(outer in outer.vec){
  outer.dt <- computeOuter(outer)
  outer.data.list[[paste(outer)]] <- data.table(outer, outer.dt)
  for(inner in inner.vec){
    inner.dt <- computeInner(outer.dt, inner)
    inner.data.list[[paste(outer, inner)]] <-
      data.table(outer, inner, inner.dt)
  }
}
outer.data <- do.call(rbind, outer.data.list)
inner.data <- do.call(rbind, inner.data.list)

Quelques commentaires :

  • La première partie consiste à initialiser des listes vides. Il y en a deux ci-dessus, outer.data.list et inner.data.list, mais on peut en initialiser autant que nécessaire .
  • La deuxième partie est un ensemble de boucles for imbriquées qui assignent des tableaux de données aux éléments de ces listes.
  • Des fonctions comme computeOuter et computeInner peuvent être utilisées, mais il est également possible d’effectuer simplement les calculs directement dans la boucle for.
  • Pour optimiser la rapidité de votre code, utilisez les opérations matrice-vecteur ou vecteur-scalaire dans la boucle for la plus interne. Si vous n’effectuez que des opérations scalaires-scalaires dans votre boucle for interne, vous améliorerez les performances de votre code en supprimant cette boucle for et en réécrivant le calcul en termes d’opérations vectorielles-scalaires.
  • paste() est utilisée pour nommer le data.table dans la liste de résultats. Bien qu’on puisse utiliser data.frame ou data.table, en pratique data.table est souvent bien plus rapide lors de l’étape finale de combinaison.
  • La dernière partie utilise do.call avec rbind pour combiner les tableaux de données stockés au cours des boucles for.

A.3 Rajouter une colonne et des facettes

Cette technique est utile pour créer des ggplots multipanneaux avec des axes alignés. Tout d’abord, définissez une fonction dont les arguments sont un tableau de données et une ou plusieurs valeurs qui serviront à ajouter des facteurs à ce tableau.

addColumn <- function(df, time.period)data.frame(
  df, time.period=factor(time.period, c("1975", "1960-2010")))
animint(
  ggplot()+
  geom_point(aes(
    x=life.expectancy, y=fertility.rate, color=region),
    data=addColumn(WorldBank1975, "1975"))+
  geom_path(aes(
    x=life.expectancy, y=fertility.rate, color=region,
    group=country),
    data=addColumn(WorldBankBefore1975, "1975"))+
  geom_line(aes(
    x=year, y=fertility.rate, color=region, group=country),
    data=addColumn(WorldBank, "1960-2010"))+
  facet_grid(. ~ time.period, scales="free")+
  xlab(""))

Notez que scales="free" et xlab("") sont utilisés, car les axes x ont maintenant des unités très différentes (année et espérance de vie).

A.4 Légendes de couleurs manuelles

On peut utiliser scale_color_manual() et scale_fill_manual() pour préciser les couleurs dans les légendes pour aes(color) et aes(fill). En règle générale, on choisit l’une des palettes ColorBrewer :

RColorBrewer::display.brewer.all()

Par exemple, pour obtenir le code R de la palette Set1, nous écrivons :

dput(RColorBrewer::brewer.pal(7, "Set1"))
c("#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", "#FF7F00", "#FFFF33", 
"#A65628")

Nous copions ensuite ce code R depuis le terminal et le collons dans l’éditeur de texte.

data(WorldBank, package="animint2")
region.colors <- c(
  "#E41A1C", "#377EB8", "#4DAF4A", "#984EA3", "#FF7F00", "#FFFF33", 
  "#A65628")
names(region.colors) <- levels(WorldBank$region)
region.colors
       East Asia & Pacific (all income levels) 
                                     "#E41A1C" 
     Europe & Central Asia (all income levels) 
                                     "#377EB8" 
 Latin America & Caribbean (all income levels) 
                                     "#4DAF4A" 
Middle East & North Africa (all income levels) 
                                     "#984EA3" 
                                 North America 
                                     "#FF7F00" 
                                    South Asia 
                                     "#FFFF33" 
        Sub-Saharan Africa (all income levels) 
                                     "#A65628" 

Nous pouvons ensuite l’utiliser avec scale_color_manual().

library(animint2)
ggplot()+
  scale_color_manual(values=region.colors)+
  geom_point(aes(
    x=life.expectancy, y=fertility.rate, color=region),
    data=WorldBank)
Warning: Removed 1490 rows containing missing values (geom_point).