Ggplot2 : mise en forme d'un barplot

Dans cette note nous proposons un petit cas pratique pour illustrer la mise en forme d'un graphique en colonnes, ou barplot, avec le package R ggplot2. On s'appuie pour cela sur les données de la fondation Gapminder en s'intéressant à la part des dépenses de santé financées par l'Etat dans les 30 pays les plus peuplés au monde.

Créer notre premier graphique avec geom_col

Notre objectif dans cet exemple est d'afficher le taux de dépenses de santé financées par l'État pour chaque pays présent dans la base. Ce barplot se réalise avec ggplot2 à l'aide de geom_col. En effet, nous voulons représenter la valeur d'une variable (ce taux de dépenses) pour chaque modalité donnée d'une variable catégorielle (le pays). Si nous avions voulu représenter le nombre de fois où une variable catégorielle apparaît dans la base, nous aurions utilisé geom_bar.
Avec ces éléments, le premier graphique qui nous viendrait à l'esprit en utilisant ggplot2 serait le suivant :

df_health %>% 
  ggplot(aes(x = country, y = gvt_health_exp_10)) + 
  geom_col()

Pelican

Il est bien sûr illisible, en raison notamment du grand nombre de pays représenté et du fait que leurs noms ne peuvent pas s'afficher correctement sur l'axe des abscisses. On peut corriger ça en faisant une rotation de l'étiquette des axes de 90° avec theme(axis.text.x = element_text(angle = 90)). Les barres sont également trop rapprochées, ce que l'on va corriger avec le paramètre width de geom_col. On obtient avec ces réglages rapides le graphique suivant :

df_health %>% 
  ggplot(aes(x = country, y = gvt_health_exp_10)) + 
  geom_col(width = 0.5) + 
  theme(axis.text.x = element_text(angle = 90))

Pelican

C'est déjà mieux! Mais il reste un peu de travail pour faciliter la lecture de ce graphique.

Mettre en forme le graphique

Pour rendre ce graphique plus agréable à lire et plus compréhensible, on propose d'ordonner l'affichage en fonction de la valeur du résultat, de mettre en forme et d'inverser les axes et enfin de changer quelques éléments graphiques.

Ordonner l'affichage en fonction de la valeur de la variable d'intérêt

Un élément important de ce graphique est que les pays sont présentés dans l'ordre alphabétique, ce qui n'a pas d'intérêt pour le lecteur. On peut facilement changer l'ordre d'affichage des modalités de l'axe des abscisses en le conditionnant aux valeurs de l'axe des ordonnées. On utilise pour cela dans l'instruction aes() la fonction reorder() au moment de la définition du x, qui nous permet de l'ordonner de manière croissante ou décroissante en fonction de notre variable d'intérêt :

# par ordre croissant 
df_health %>% 
  ggplot(aes(x = reorder(country, gvt_health_exp_10), y = gvt_health_exp_10)) + 
  geom_col(width = 0.5) + 
  theme(axis.text.x = element_text(angle = 90))  

# par ordre décroissant
df_health %>% 
  ggplot(aes(x = reorder(country, -gvt_health_exp_10), y = gvt_health_exp_10)) + 
  geom_col(width = 0.5) + 
  theme(axis.text.x = element_text(angle = 90))

Pelican

Il est maintenant bien plus facile de situer chaque pays par rapport aux autres.

Mise en forme des axes

Avec l'instruction labs, on définit tout d'abord les titres de nos axes ainsi que le titre général du graphique. Puis, dans scale_y_continuous, on met en forme l'axe représentant les parts de dépenses de santé :
- avec le paramètre labels on fait apparaître les étiquettes sous forme de pourcentage grâce à la fonction scales::percent().
- avec le paramètre limits on fait en sorte que les pourcentages affichés aillent jusqu'à 1, de manière à ce que le lecteur ait une représentation plus juste de ce que serait la part de dépenses restantes financées par les patients ou des organismes d'assurance privés.
- le paramètre expand = c(0, 0) permet de supprimer les espaces avant et après les valeurs minimum et maximum de notre variable d'intérêt.
Pour mieux lire les noms des pays, on intervertit l'axe des ordonnées et des abscisses avec l'instruction coord_flip() pour avoir un graphique en barres horizontales. Enfin, on règle la taille des labels des éléments de x et de y.

df_health %>% 
  ggplot(aes(x = reorder(country, gvt_health_exp_10), y = gvt_health_exp_10)) + 
  geom_col(width = 0.2) +
  labs(x = "Pays",
       y  = "Part de dépenses de santé",
       title = "Part des dépenses de santé financées par l'Etat\n dans les 30 pays les plus peuplés") + 
  scale_y_continuous(labels = ~ scales::percent(., accuracy = 1),
                     limits = c(0, 1), expand = c(0, 0)) + 
  coord_flip() -> plot_health

plot_health  + 
  theme(axis.text.x = element_text(size = 6),
        axis.text.y = element_text(size = 7))

Pelican

Utilisation d'un thème

Pour l'affichage graphique il est possible de régler chaque élément du graphique comme on le souhaite. Le plus facile reste cependant d'utiliser les nombreux thèmes existants disponibles, par défaut dans ggplot2 ou en installant d'autres packages, comme ggthemes. Pour les utiliser il suffit d'ajouter l'instruction + theme_*() à la suite de votre plot. Le thème par défaut dans ggplot2 est theme_gray. On vous présente le résultat donné par theme_economist, disponible dans la librairie ggthemes, qui reprend la charte graphique du magazine The Economist. On ajuste également la taille des labels à ce nouveau thème.

library(ggthemes)

plot_health + theme_economist() + 
  theme(axis.text.x = element_text(size = 7),
        axis.text.y = element_text(size = 8))

Pelican

C'est la fin de cet article! N'hésitez pas à visiter notre site et à nous suivre sur Twitter et Linkedin. Pour retrouver l'ensemble du code ayant servi à générer cette note, vous pouvez vous rendre sur le github de Statoscop.