HOWTO · R
Créer des boîtes à moustaches groupées dans R
Cet article explique comment créer des boîtes à moustaches groupées dans R
Sur cette page
Une boîte à moustaches groupée avec ggplot2 se résume à une seule décision : quelle variable doit diviser les données en groupes que vous voulez comparer. Vous pouvez mapper cette variable à l’esthétique fill pour que geom_boxplot() dessine des boîtes côte à côte à l’intérieur de chaque position sur l’axe x, ou répartir les données dans des panneaux séparés avec facet_wrap(). Les exemples ci-dessous utilisent le jeu de données gapminder avec le package dplyr, et chaque méthode produit une boîte à moustaches groupée que vous pouvez adapter à vos propres colonnes.
Construire une boîte à moustaches groupée avec geom_boxplot()
La fonction ggplot, associée à geom_boxplot, sert généralement à construire des objets de type boîte à moustaches. Le premier argument de ggplot est le jeu de données, et le second est la liste des mappages esthétiques créés avec aes. Dans les mappages ci-dessous, x et y pointent vers les colonnes continent et lifeExp de gapminder, filtrées sur trois années sélectionnées avec les fonctions dplyr. Les libellés d’axes affichés dans le bloc de code restent en anglais, à l’identique de l’exemple canonique.
if (requireNamespace("ggplot2", quietly = TRUE) &&
requireNamespace("gapminder", quietly = TRUE) &&
requireNamespace("dplyr", quietly = TRUE)) {
library(ggplot2)
library(gapminder)
library(dplyr)
dat <- gapminder %>%
filter(year %in% c(1972, 1992, 2007))
print(ggplot(dat, aes(x = continent, y = lifeExp)) +
geom_boxplot() +
scale_y_continuous(name = "Average Life Expectancy") +
scale_x_discrete(labels = abbreviate, name = "Continent"))
}
Cet appel dessine une boîte par continent. Le graphique est déjà groupé par la variable x, mais les années au sein de chaque continent sont encore fusionnées. L’étape suivante consiste à ajouter la seconde variable de regroupement. Le garde-fou requireNamespace permet au script de se terminer proprement lorsque les packages de tracé ne sont pas installés ; le dessin est alors ignoré. Considérez donc le code comme une illustration de syntaxe et appuyez-vous sur les figures rendues plus loin dans l’article.
Grouper les boîtes avec l’esthétique fill
Mapper une colonne à fill indique à geom_boxplot de dessiner une boîte distincte pour chacun de ses groupes à l’intérieur de chaque position sur l’axe x. Il y a cependant un piège : fill ne crée des groupes distincts que lorsque la variable mappée est discrète. La colonne year de gapminder est numérique, donc fill = year est traité comme un dégradé de couleurs continu et le graphique ne se divise pas en boîtes annuelles. L’encapsuler dans factor convertit les nombres en niveaux catégoriels, ce qui produit les boîtes côte à côte attendues. Vous pouvez voir la distinction en R de base :
Le code et la sortie affichés ci-dessous restent en anglais, à l’identique de l’exemple canonique.
year <- c(1972, 1992, 2007)
print(class(year))
print(class(factor(year)))
print(levels(factor(year)))
[1] "numeric"
[1] "factor"
[1] "1972" "1992" "2007"
Un year numérique reste une valeur continue, tandis que factor(year) porte des niveaux nommés — et fill ne se déploie en boîtes distinctes que pour la seconde forme. Dans ggplot2, la même distinction détermine la disposition. Les libellés d’axes visibles dans le bloc de code suivant restent en anglais :
if (requireNamespace("ggplot2", quietly = TRUE) &&
requireNamespace("gridExtra", quietly = TRUE) &&
requireNamespace("gapminder", quietly = TRUE) &&
requireNamespace("dplyr", quietly = TRUE)) {
library(ggplot2)
library(gridExtra)
library(gapminder)
library(dplyr)
dat <- gapminder %>%
filter(year %in% c(1972, 1992, 2007))
p1 <- ggplot(dat, aes(x = continent, y = lifeExp, fill = year)) +
geom_boxplot() +
scale_y_continuous(name = "Average Life Expectancy") +
scale_x_discrete(labels = abbreviate, name = "Continent")
p2 <- ggplot(dat, aes(x = continent, y = lifeExp, fill = factor(year))) +
geom_boxplot() +
scale_y_continuous(name = "Average Life Expectancy") +
scale_x_discrete(labels = abbreviate, name = "Continent")
grid.arrange(p1, p2, nrow = 2)
}
Le panneau supérieur garde year numérique et reste non groupé, tandis que le panneau inférieur utilise factor(year) et affiche trois boîtes par continent, une pour chaque année sélectionnée.
Répartir les groupes en panneaux avec facet_wrap()
La fonction facet_wrap est une autre option pour dessiner des boîtes à moustaches groupées par une variable choisie. Elle crée ici un panneau par année. facet_wrap fonctionne sans mappage fill, mais conserver fill = factor(year) colore les boîtes afin que les panneaux soient plus faciles à distinguer.
Le code et les libellés affichés dans cette section restent en anglais, à l’identique de l’exemple canonique.
if (requireNamespace("ggplot2", quietly = TRUE) &&
requireNamespace("gapminder", quietly = TRUE) &&
requireNamespace("dplyr", quietly = TRUE)) {
library(ggplot2)
library(gapminder)
library(dplyr)
dat <- gapminder %>%
filter(year %in% c(1972, 1992, 2007))
p3 <- ggplot(dat, aes(x = continent, y = lifeExp, fill = factor(year))) +
geom_boxplot() +
facet_wrap(~year) +
scale_y_continuous(name = "Average Life Expectancy") +
scale_x_discrete(labels = abbreviate, name = "Continent")
print(p3)
}
Par défaut, chaque panneau produit par facet_wrap partage les mêmes échelles, ce qui permet de comparer directement les valeurs entre panneaux. Passer scales = "free" laisse chaque panneau ajuster ses propres axes aux données qu’il contient ; cela peut révéler des détails dans un panneau étroit, mais rend aussi les comparaisons entre panneaux trompeuses, car des hauteurs identiques ne signifient plus des valeurs identiques. Le bloc de code suivant conserve également ses libellés d’axes en anglais.
if (requireNamespace("ggplot2", quietly = TRUE) &&
requireNamespace("gapminder", quietly = TRUE) &&
requireNamespace("dplyr", quietly = TRUE)) {
library(ggplot2)
library(gapminder)
library(dplyr)
dat <- gapminder %>%
filter(year %in% c(1972, 1992, 2007))
p4 <- ggplot(dat, aes(x = continent, y = lifeExp, fill = factor(year))) +
geom_boxplot() +
facet_wrap(~year, scales = "free") +
scale_y_continuous(name = "Average Life Expectancy") +
scale_x_discrete(labels = abbreviate, name = "Continent")
print(p4)
}
Choisir une disposition et vérifier le résultat
Utilisez le regroupement par fill lorsque vous avez un petit nombre de groupes et que vous voulez les comparer directement à l’intérieur de chaque catégorie x ; utilisez facet_wrap lorsqu’il y a beaucoup de groupes ou que chaque sous-ensemble mérite son propre panneau. Vous pouvez aussi intervertir la variable mappée à fill et celle qui sert de facette. L’exemple ci-dessous revient au jeu de données gapminder non filtré, mappe continent à fill et laisse facet_wrap prendre chaque année disponible.
Le code et les libellés affichés dans cette section restent en anglais, à l’identique de l’exemple canonique.
if (requireNamespace("ggplot2", quietly = TRUE) &&
requireNamespace("gapminder", quietly = TRUE)) {
library(ggplot2)
library(gapminder)
p5 <- ggplot(gapminder, aes(x = continent, y = lifeExp, fill = continent)) +
facet_wrap(~year) +
geom_boxplot() +
scale_y_continuous(name = "Average Life Expectancy") +
scale_x_discrete(labels = abbreviate, name = "Continent")
print(p5)
}
Quelle que soit la disposition choisie, vérifiez que le graphique rendu affiche le nombre attendu de boîtes ou de panneaux par groupe. Si une colonne numérique produit une légende de couleurs continue au lieu de boîtes distinctes, convertissez-la d’abord avec factor ; si des panneaux semblent identiques en forme mais diffèrent en position, confirmez que les échelles sont partagées avant de lire des valeurs sur le graphique.