Mes astuces préférées pour travailler avec ggplot2 dans un document RMarkdown

Par Benjamin Louis | 10 Jun 2020 | en

Le contexte

Écrire un document R Markdown permet d’insérer du code R et ses résultats directement dans un rapport dont on choisira le format de sortie (HTML, PDF, Word). C’est un atout précieux dans la reproductibilité des analyses et dans la communication de méthodes et résultats d’analyse. En tant que personne dont le métier est d’analyser quotidiennement des données pour des clients et de livrer fréquemment les résultats sous forme de rapport, R Markdown est devenu un outil essentiel de mon quotidien.

Une analyse de données passe inévitablement par l’utilisation de graphique. Il existe tout un panel de packages dans R pour construire des graphiques mais ggplot2 reste mon préféré (et je sais ne pas être le seul). J’intégre donc fréquemment des graphiques faits avec ggplot2 dans mes documents R Markdown.

Pour obtenir le résultat voulu, il y a tout un tas de configurations possibles, pour les graphiques ggplot2, comme pour les documents R Markdown. Cet article a pour but de vous offrir quelques solutions qui j’espère vous seront utiles.

Pré-requis

  1. Je pars du principe que vous avez déjà créer un graphique avec ggplot2 ou a minima vu des lignes de code utilisant ggplot2. Si ça n’est pas le cas, vous pouvez commencer par consulter ce livre disponible gratuitement en ligne. Pour ne plus utiliser le jeu de données iris, j’utilise une représentation graphique du jeu de données sur les pingouins d’Antarctique mis très récemment en package R par Allison Horst (allez voir ses dessins également !). On partira du graphique suivant :
library(ggplot2)
p <- ggplot(penguins_raw, aes(x = culmen_length_mm, y = culmen_depth_mm, color = species, fill = species)) +
  geom_point() +
  geom_smooth(method = "lm", formula = "y ~ x", alpha = 0.3) +
  scale_color_viridis_d() +
  scale_fill_viridis_d() +
  labs(x = "Culmen Length (mm)", y = "Culmen depth (mm)", fill = "Species", color = "Species")
p

  1. De même, vous avez déjà créé un document R Markdown (a minima vu comment on fait) et vous savez comment intégrer du code R dans ce document (à l’aide d’un chunk). Dans le cas contraire, commencez ici.

Créer son propre thème ggplot2

Le thème ggplot2 correspond à l’apparence du graphique. Il est possible de changer des éléments un par un via la fonction theme() mais il existe également des thèmes pré-configurés. Par défaut c’est theme_gray() qui est utilisé. Personnellement j’utilise plus souvent theme_bw() (pour black and white).

p + labs(title = "Thème par défaut")
p + theme_bw() + labs(title = "Avec theme_bw()")

Si vous appliquez souvent les mêmes changements via la fonction theme(), je vous recommande fortement de créer votre propre thème. Voici un exemple personnalisé :

theme_ben <- function(base_size = 14) {
  theme_bw(base_size = base_size) %+replace%
    theme(
      # L'ensemble de la figure
      plot.title = element_text(size = rel(1), face = "bold", margin = margin(0,0,5,0), hjust = 0),
      # Zone où se situe le graphique
      panel.grid.minor = element_blank(),
      panel.border = element_blank(),
      # Les axes
      axis.title = element_text(size = rel(0.85), face = "bold"),
      axis.text = element_text(size = rel(0.70), face = "bold"),
      axis.line = element_line(color = "black", arrow = arrow(length = unit(0.3, "lines"), type = "closed")),
      # La légende
      legend.title = element_text(size = rel(0.85), face = "bold"),
      legend.text = element_text(size = rel(0.70), face = "bold"),
      legend.key = element_rect(fill = "transparent", colour = NA),
      legend.key.size = unit(1.5, "lines"),
      legend.background = element_rect(fill = "transparent", colour = NA),
      # Les étiquettes dans le cas d'un facetting
      strip.background = element_rect(fill = "#17252D", color = "#17252D"),
      strip.text = element_text(size = rel(0.85), face = "bold", color = "white", margin = margin(5,0,5,0))
    )
}

Et voici ce que ça donne en comparaison du thème par défaut :

p + labs(title = "Thème par défaut")
p + theme_ben() + labs(title = "Avec mon thème personnalisé")

Pour construire un thème personnalisé on crée une fonction R qui part d’un thème ggplot2 existant dont on remplace les élèments avec la fonction theme(). L’astuce réside dans l’utilisation de %+replace% au lieu du traditionnel +. Contrairement à ce dernier, %+replace% ne fait pas que mettre à jour les éléments d’un thème mais les remplace totalement.

C’est maintenant qu’il faut faire intervenir votre créativité. La liste des éléments modifiables est très grande et donc la personnalisation quasi infinie. Vous trouverez cette liste dans la page de la fonction theme(). Dans mon exemple, je fais des modifications sur l’ensemble de la figure (élément plot.*), sur la zone où est le graphique (panel.*), sur les axes (axis.*), la légende (legend.*) et les étiquettes des graphiques (strip.*) lorsque j’utilise du facetting.

Les axes et légendes sont pour moi des élèments essentiels et mes choix se portent principalement sur leur mise en valeur. Cela passe par leur taille relative via l’utilisation de la fonction rel() qui retourne une proportion de la taille de base (base_size) et de la mise du texte en gras (face = "bold").

La modification d’un thème peut s’avérer laborieuse au départ mais si vous savez que vous utiliserez très souvent les mêmes réglages, le jeu en vaut la chandelle. Il existe tout un tas de ressources sur internet pour vous aider. N’hésitez pas également à me contacter, je me ferais un plaisir de vous aider.

Vous pouvez intégrer ce thème dans un bloc de code (chunk) au début de votre document R Markdown de sorte qu’il soit réutilisable tout le long du document. Vous pouvez également l’intégrer dans un package R, parmi d’autres, et charger ce package.

Votre graphique ggplot dans R Markdown

Options des blocs de code pour les figures

Pour intégrer du code R et les résultats de ce code dans un document R Markdown vous utilisez un chunk R avec différentes options :

```{r option1 = valeur_option1, option2 = valeur_option2}
# Le code R ici
```

Certaines de ces options sont spécifiques pour les figures générées par R via ce code :

  • Les options relatives à la taille des figures générées par R

  • Les options relatives à la taille des figures dans le document final

Taille des figures générées par R

Les options fig.width et fig.height permettent respectivement de fixer la largeur et la hauteur de la figure générée par R. Par défaut, leur valeur est fixer à 7 (les dimensions sont en pouces). Une alternative que je préfère personnellement est d’utiliser une seule de ces valeurs (fig.width) en association avec une autre option fig.asp qui fixe le ratio hauteur/largeur de la figure. Il m’est personnellement plus facile de penser directement en terme de ratio que de donner une taille pour la largeur et une pour la hauteur séparément. Par défaut, fig.asp est NULL mais je le fixe très souvent à \(0,8\) car c’est un ratio qui correspond très souvent au résultat que je cherche.

Les options de taille de la figure générée par R ont des conséquences sur la taille relative des éléments de la figure. Pour une figure ggplot2, ces éléments resteront à la taille définie dans le thème utilisée quelque soit la taille globale choisie pour la figure. Une taille importante peut donner un rendu de texte trop petit et vice versa.

fig.width = 3 - éléments du graphique relativement trop grands

```{r fig.asp = 0.8, fig.width = 3}
p + theme_ben()
```

fig.width = 10 - éléments du graphique relativement trop petits

```{r fig.asp = 0.8, fig.width = 10}
p + theme_ben()
```

Pour avoir le rendu qui vous plaît, il vous faudra donc combiner entre les tailles choisies dans votre thème et celles utilisées dans les options du code. Pour mon thème, la taille par défaut (7) correspond à ce que je veux.

```{r fig.asp = 0.8, fig.width = 7}
p + theme_ben()
```

Lorsque les textes des axes sont plus longs ou que le graphique est chargé, je peux choisir une taille plus importante (8 ou 9) pour que que les éléments du graphique soit relativement plus petit. Notez que pour le texte, une simple modification de la taille de base dans le thème suffit. Vous pouvez alors obtenir des graphiques similaires en modifiant l’un ou l’autre.

fig.width = 9 - base_size = 14 (défaut)

```{r fig.asp = 0.8, fig.width = 9}
p + theme_ben(base_size = 14)
```

fig.width = 7 (défaut) - base_size = 12

```{r fig.asp = 0.8, fig.width = 7}
p + theme_ben(base_size = 12)
```

Taille de la figure dans le document

Les figures générées par R dans un document RMarkdown sont exportées (en format png par défaut) avant d’être insérées dans le document final. Il est possible de modifier la taille de la figure dans le document final avec les options out.width et out.height.

Il est rare que j’ai à revoir le ratio entre hauteur et largeur après avoir généré la figure dans R, j’utilise donc quasi-systématiquement uniquement out.width. La solution qui me paraît la plus favorable pour définir une valeur est en pourcentage. Ainsi, une valeur de 100% donne :

```{r fig.asp = 0.8, fig.width = 7, out.width = "100%}
p + theme_ben()
```

tandis qu’une valeur de 50% donne :

```{r fig.asp = 0.8, fig.width = 7, out.width = "50%}
p + theme_ben()
```

Vous voyez que cette fois-ci, la taille relative des éléments est inchangée. Le graphique est le même, il est simplement montré avec une taille plus ou moins grande.

Éviter de vous répéter

Il est toujours frustrant de devoir écrire plusieurs fois la même chose dans une document. Ici, à chaque bloc de code avec une figure ggplot2, il faut préciser notre nouveau thème et les valeurs des options du code correspondant à la taille de la figure. Pas de panique, il existe des solutions pour combler votre (ma!) fainéantise.

Changer le thème ggplot2 par défaut

Vous pouvez changer le thème par défaut pour ggplot2 avec la fonction theme_set(). Il suffit pour cela de mettre après création de votre thème (ou chargement du package le contenant) la commande :

theme_set(theme_ben()) # remplacer theme_ben() par le nom du thème voulu

Changer les valeurs par défaut des options des blocs de code

Vous pouvez changer les valeurs par défaut des options des blocs de code en mettant celui-ci en début de document :

```{r setup, include=FALSE}
knitr::opts_chunk$set(
 fig.width = 6,
 fig.asp = 0.8,
 out.width = "80%"
)
```

Ces valeurs seront appliquées à tous les blocs de code sauf spécification contraire ponctuelle. Vous pouvez alors mettre les options que vous utilisez souvent et éviter d’avoir à les recopier à chaque fois.

À quoi peut ressembler le début de votre document R Markdown

Avec ces astuces, voilà à quoi peut ressembler le début d’un document RMarkdown dont la sortie sera sous format HTML :

---
title: "Mon super titre"
author: "Benjamin Louis"
date: "25/05/2020"
output: html_document
---


```{r setup, include=FALSE}
# Option de chunk
knitr::opts_chunk$set(
 fig.width = 6,
 fig.asp = 0.8,
 out.width = "80%"
)
```

```{r theme_ggplot2, echo = FALSE}
# Création du thème ggplot2
library(ggplot)
theme_ben <- function(base_size = 14) {
  theme_bw(base_size = base_size) %+replace%
    theme(
      # Les options du thème
    )
}
# Changement du thème par défaut
theme_set(theme_ben())
```

À vous désormais de modifier tout ce que vous souhaitez pour créer un thème ggplot2 et mettre vos valeurs préférées d’options de code par défaut. Ces options ne se limitent pas à celles des figures R, n’hésitez pas à consulter cette page pour en découvrir d’autres.

J’espère que cette article vous aura aidé à écrire des rapports qui vous plaisent et n’hésitez pas à partager vos astuces en commentaire!

Disponibilités des données

Références des données

comments powered by Disqus