Je propose ici le premier post d’une série inspirée de l’émission “One Chart at a Time” diffusée sur la chaîne Youtude du spécialiste en datavisualisation John Schwabish. Il s’agira dans chaque édition de décrire un type de graphe particulier, d’en rappeler les principes, de souligner les points importants à retenir les concernant, d’alerter sur ce que l’on devrait faire ou pas faire lorsqu’on les utilise. L’idée est d’aboutir à une lecture critique des graphes présentés et de voir comment on peut les réaliser de manière rigoureuse et esthétique. Bien sûr, l’ensemble sera illustré en utilisant GGPLOT. Pour mieux se repairer dans les différents contenus du site, les textes de la série seront indexés par un code commençant par GT (pour graph type).

Commençons notre tour d’horizon (non exhaustif) par le très simple et très classique diagrammes à bâtons (en anglais bar chart). Il est mobilisé pour présenter les effectifs des différentes modalités d’une variable qualitative, catégorielle ou ordinale. Il est composé à la base d’une série de lignes ou barres dont la longueur (ou la hauteur) est proportionnelle à l’importance de la modalité exprimée. Les autres dimensions, lorsqu’il s’agit de barres, sont laissées constantes.

La principale recommandation de forme que l’on peut faire concernant ces diagrammes est de toujours faire apparaître l’origine dans le graphe, la valeur zéro à partir de laquelle les lignes représentant les effectifs commencent. Faute de cela, le graphe pourrait présenter pour importantes des différences qui à bien y regarder ne le sont pas.

Les barres peuvent être présentées verticalement ou horizontalement en fonction de ce qui apparaît le plus adéquate ou esthétique par rapport au document dans lequel elles s’insèrent.

Si possible, il est recommandé, afin de rendre l’ensemble plus lisible, d’appliquer une certaine logique à l’ordre des modalités présentées (de la plus fréquente à la moins fréquente ou inversement, de la plus grave à la moins grave …). Cela est à déterminer en fonction de votre objectif.

Concernant les couleurs appliquées. Il est recommandé d’utiliser un ensemble neutre et de jouer sur l’intensité pour guider l’attention du lecteur sur les valeurs d’intérêt (celles que vous cherchez à mettre en avant).

Les étiquettes rappelant les catégories peuvent être intégrées dans les barres plutôt que dans une légende, ou, lorsqu’il y en a beaucoup, elles peuvent être insérées dans les intervalles les séparant. Une possibilité est d’indiquer à une extrémité le nom de la catégorie et de l’autre l’effectif mesuré.

Tous ceci étant posé, prenons des données afin d’avoir une vue plus directe de ces différents points. Intéressons-nous au Basket-Ball professionnel. Établissons un diagramme indiquant les équipes ayant drafté le plus souvent en première position entre 1983 et 2018.

Mais, au préalable, chargeons deux packages, le classique tidyverse ainsi que nbastatR, qui va scrapper sur le site basketball-reference.com les informations désirées. Pour plus d’information sur ce package et son installation, je vous renvois sur son site compagnon.

library(tidyverse)
library(nbastatR)

Utilisons la fonction drafts() en indiquant les années recherchées. Limitons la base aux seuls 1er de drafts et voyons ce que l’on obtient.

draft_1 <- drafts(draft_years = 1983:2018,
                    nest_data = FALSE,
                    return_message = FALSE) %>% 
           filter(numberPickOverall==1)
draft_1
## # A tibble: 36 x 18
##     ...1 yearDraft numberPickOverall numberRound numberRoundPick namePlayer     
##    <dbl>     <dbl>             <dbl>       <dbl>           <dbl> <chr>          
##  1     1      2018                 1           1               1 Deandre Ayton  
##  2     2      2017                 1           1               1 Markelle Fultz 
##  3     3      2016                 1           1               1 Ben Simmons    
##  4     4      2015                 1           1               1 Karl-Anthony T~
##  5     5      2014                 1           1               1 Andrew Wiggins 
##  6     6      2013                 1           1               1 Anthony Bennett
##  7     7      2012                 1           1               1 Anthony Davis  
##  8     8      2011                 1           1               1 Kyrie Irving   
##  9     9      2010                 1           1               1 John Wall      
## 10    10      2009                 1           1               1 Blake Griffin  
## # ... with 26 more rows, and 12 more variables: slugTeam <chr>,
## #   nameOrganizationFrom <chr>, typeOrganizationFrom <chr>, idPlayer <dbl>,
## #   idTeam <dbl>, nameTeam <chr>, cityTeam <chr>, teamName <chr>,
## #   PLAYER_PROFILE_FLAG <dbl>, slugOrganizationTypeFrom <chr>,
## #   locationOrganizationFrom <chr>, nom_eq <chr>

Maintenant que nous avons les données, nous pouvons nous attaquer à notre graphe. Pour le diagramme à bâtons, nous utilisons le geom_bar(). La variable dénombrée et représentée est nameTeam, indiquons-le dans aes().

ggplot(draft_1, aes(nameTeam)) +
  geom_bar() 

Le résultat est peu lisible notamment du fait des noms qui se chevauchent. Retournons l’ensemble pour voir si les choses sont mieux avec des barres horizontales. Utilisons la commande coord_flip().

ggplot(draft_1, aes(nameTeam)) +
  geom_bar() +
  coord_flip()

C’est mieux. Réduisons l’épaisseur des barres et colorons-les en rouge.

ggplot(draft_1, aes(nameTeam)) +
  geom_bar(size=0.5,fill='red',width=0.1) +
  coord_flip()

Supprimons les titres des axes qui apparaissent superflus.

ggplot(draft_1, aes(nameTeam)) +
  geom_bar(size=0.5,fill='red',width=0.1) +
  coord_flip()+
  theme(axis.title = element_blank())

Ajoutons un titre et une caption indiquant la source des données.

ggplot(draft_1, aes(nameTeam)) +
  geom_bar(size=0.5,fill='red',width=0.1) +
  labs(title='1er choix de draft NBA (1983-2018)',
       caption = 'Source: Basketball Reference (via nbastatR)')+
  coord_flip()+
  theme(axis.title = element_blank())

Centrons le titre, mettons-le en gras et passons le caption à l’italic.

ggplot(draft_1, aes(nameTeam)) +
  geom_bar(size=0.5,fill='red',width=0.1) +
  labs(title='1er choix de draft NBA (1983-2018)',
       caption = 'Source: Basketball Reference (via nbastatR)')+
  coord_flip()+
  theme(axis.title = element_blank(),
        plot.title=element_text(face='bold',hjust=0.5),
        plot.caption=element_text(face='italic'))

Le cadre gris à l’arrière des barres n’est pas particulièrement beau. Passons à thème plus discret. Essayons le theme_minimal().

ggplot(draft_1, aes(nameTeam)) +
  geom_bar(size=0.5,fill='red',width=0.1) +
  labs(title='1er choix de draft NBA (1983-2018)',
       caption = 'Source: Basketball Reference (via nbastatR)')+
  coord_flip()+
  theme_minimal() +
  theme(axis.title = element_blank(),
        plot.title=element_text(face='bold',hjust=0.5),
        plot.caption=element_text(face='italic'))

Supprimons la grille à l’arrière du graphe. Encore une fois, elle ne sert pas à grand chose.

ggplot(draft_1, aes(nameTeam)) +
  geom_bar(size=0.5,fill='red',width=0.1) +
  labs(title='1er choix de draft NBA (1983-2018)',
       caption = 'Source: Basketball Reference (via nbastatR)')+
  coord_flip()+
  theme_minimal() +
  theme(axis.title = element_blank(),
        plot.title=element_text(face='bold',hjust=0.5),
        plot.caption=element_text(face='italic'),
        panel.grid = element_blank())

Déplaçons les noms des équipes de manière à ce qu’ils figurent au dessus des barres. Pour cela, utilisons dans notre element_text() l’option margin. Ses arguments sont t, pour top,r, pour right, b, pour bottom, et l, pour left. Utilisons r pour déplacer le texte sur la droite d’une valeur de -120. Ajustons l’ensemble en termes d’alignements.

ggplot(draft_1, aes(nameTeam)) +
  geom_bar(size=0.5,fill='red',width=0.1) +
  labs(title='1er choix de draft NBA (1983-2018)',
       caption = 'Source: Basketball Reference (via nbastatR)')+
  coord_flip() +
  theme_minimal() +
  theme(plot.title=element_text(face='bold',hjust=0.5),
        plot.caption=element_text(face='italic'),
        axis.title = element_blank(),
        axis.text.y = element_text(margin = margin( r = -120),
                                   vjust=-0.5,hjust=0),
        panel.grid = element_blank()) 

Le résultat est intéressant. Mais, on peut améliorer les choses en modifiant l’ordre des équipes de manière à présenter en premier celles qui ont le plus fréquemment drafté en premier. Pour cela, commençons par transformer notre variable nameTeam en facteur en utilisant la fonction factor().

draft_1$nameTeam<-factor(draft_1$nameTeam)

Ceci fait, nous allons l’utiliser dans notre graphe comme esthètique (élément représenté). Mais avant redéfinissons les différents niveaux de la variable en fonction de leur fréquence. Pour cela, nous utilisons la fonction fct_infreq() qui fait partie du package forcats(lui-même intégré au tidyverse).

ggplot(draft_1,aes(fct_infreq(nameTeam)))+
  geom_bar(size=0.5,fill='red',width=0.1) +
  labs(title='1er choix de draft NBA (1983-2018)',
       caption = 'Source: Basketball Reference (via nbastatR)')+
  coord_flip() +
  theme_minimal() +
  theme(plot.title=element_text(face='bold',hjust=0.5),
        plot.caption=element_text(face='italic'),
        axis.title = element_blank(),
        axis.text.y = element_text(margin = margin( r = -120),
                                   vjust=-0.5,hjust=0),
        panel.grid = element_blank()) 

Le résultat est pas mal. Mais, c’est à l’envers par rapport à ce que l’on cherche à obtenir. Il nous faut inverser l’ordre du facteur nameTeam. Pour cela, utilisons la fonction fct_rev() qui fait également partie du package forcats.

ggplot(draft_1,aes(fct_rev(fct_infreq(nameTeam))))+
  geom_bar(size=0.5,fill='red',width=0.1) +
  labs(title='1er choix de draft NBA (1983-2018)',
       caption = 'Source: Basketball Reference (via nbastatR)')+
  coord_flip() +
  theme_minimal() +
  theme(plot.title=element_text(face='bold',hjust=0.5),
        plot.caption=element_text(face='italic'),
        axis.title = element_blank(),
        axis.text.y = element_text(margin = margin( r = -120),
                                   vjust=-0.5,hjust=0),
        panel.grid = element_blank()) 

Et voilà, le tour est joué. On obtient le diagramme à bâtons désiré. Il est à la fois simple et informatif. Cleveland apparaît nettement comme la franchise ayant le plus fréquemment drafté en premier sur la période avec dans l’ordre Brad Daugherty, Lebron James, Kyrie Irving, Anthony Bennett et Andrew Wiggins.