Commencer par une boîte à moustaches simple
Une boîte à moustaches résume une distribution numérique par sa médiane, ses quartiles, ses moustaches et ses valeurs potentiellement aberrantes.
Graphiques R · Boîte à moustaches
Des exemples pratiques pour lire et concevoir des boîtes à moustaches, d’une seule distribution aux comparaisons de groupes, aux données superposées et aux graphiques interactifs.
Les boîtes à moustaches révèlent la tendance centrale, la dispersion, l’asymétrie et les valeurs potentiellement aberrantes sans afficher chaque observation. Elles sont particulièrement utiles pour comparer plusieurs groupes côte à côte sur une même échelle.
Une boîte à moustaches résume une distribution numérique par sa médiane, ses quartiles, ses moustaches et ses valeurs potentiellement aberrantes.

La boîte couvre l’intervalle interquartile, le trait central marque la médiane et les moustaches atteignent les valeurs les plus extrêmes situées à moins de 1,5 fois l’écart interquartile des quartiles.
boxplot(iris$Sepal.Length,
main = "Sepal length",
ylab = "Centimetres")Une boîte horizontale présente la distribution de gauche à droite et peut faciliter la lecture des longs libellés.

Indiquez horizontal = TRUE et remplacez le libellé de l’axe vertical par celui de l’axe horizontal. Le résumé statistique reste inchangé ; seule l’orientation diffère.
boxplot(iris$Sepal.Length, horizontal = TRUE,
col = "#dbeafe", border = "#2563eb",
main = "Horizontal boxplot", xlab = "Centimetres")Des couleurs de remplissage et de contour bien choisies distinguent les distributions tout en préservant la structure statistique de la boîte.

Utilisez col pour le remplissage et border pour le contour. Des couleurs sobres mettent en valeur la médiane, les moustaches et les valeurs aberrantes.
boxplot(iris$Sepal.Length,
col = "#2563eb", border = "#172554",
main = "Boxplot with color", ylab = "Centimetres")Des boîtes groupées placent plusieurs distributions sur une même échelle pour comparer directement leurs tendances centrales, leurs dispersions et leurs valeurs aberrantes.

La notation par formule sépare la variable à expliquer, à gauche, de la variable de groupe, à droite. Ici, la longueur des sépales est comparée entre trois espèces d’iris.
boxplot(Sepal.Length ~ Species, data = iris,
col = c("#bfdbfe", "#60a5fa", "#1d4ed8"),
main = "Sepal length by species",
xlab = "Species", ylab = "Centimetres")Une boîte à encoches ajoute un intervalle de confiance approximatif autour de chaque médiane pour faciliter une comparaison visuelle prudente.

Indiquez notch = TRUE. Des encoches qui ne se chevauchent pas suggèrent une différence entre médianes, mais le graphique reste un outil exploratoire et ne remplace pas une inférence formelle.
boxplot(Sepal.Length ~ Species, data = iris,
notch = TRUE, col = "#bfdbfe",
main = "Notched boxplots",
xlab = "Species", ylab = "Centimetres")Les boîtes de largeur variable sont dimensionnées selon la racine carrée de l’effectif de chaque groupe.

Indiquez varwidth = TRUE lorsque les groupes ont des effectifs différents. La largeur apporte alors une information utile sur la taille des échantillons sans modifier les quartiles.
set.seed(42)
group <- rep(c("Small", "Medium", "Large"), c(20, 45, 90))
value <- rnorm(length(group), rep(c(4.8, 5.5, 6.2), c(20, 45, 90)))
boxplot(value ~ group, varwidth = TRUE, col = "#93c5fd",
main = "Width reflects sample size", ylab = "Value")Les points au-delà des moustaches sont des valeurs potentiellement aberrantes selon la règle des boîtes à moustaches ; ce ne sont pas automatiquement des erreurs ou des observations à supprimer.

Les arguments outpch, outcol et outcex contrôlent leur apparence. Examinez les observations inhabituelles dans leur contexte avant toute décision analytique.
set.seed(42)
values <- c(rnorm(80, 10, 1.2), 14.5, 15.2)
boxplot(values, col = "#dbeafe", border = "#2563eb",
outpch = 19, outcol = "#dc2626", outcex = 1.2,
main = "Potential outliers", ylab = "Value")Une superposition de points légèrement décalés combine le résumé de la distribution avec les observations brutes qui le produisent.

Tracez d’abord la boîte, puis ajoutez stripchart() avec un décalage aléatoire. Cette méthode est particulièrement utile pour les petits et moyens échantillons, dont la densité reste lisible.
boxplot(Sepal.Length ~ Species, data = iris,
col = "#dbeafe", outline = FALSE,
main = "Boxplots with observations", ylab = "Centimetres")
stripchart(Sepal.Length ~ Species, data = iris,
vertical = TRUE, method = "jitter", add = TRUE,
pch = 19, col = adjustcolor("#172554", 0.45))Des boîtes côte à côte résument plusieurs variables numériques lorsqu’elles partagent des unités et des échelles compatibles.

Transmettre un tableau de données numériques crée une boîte par colonne. Standardisez d’abord les variables si leurs unités ou leurs ordres de grandeur ne sont pas directement comparables.
boxplot(iris[1:4],
col = c("#dbeafe", "#bfdbfe", "#93c5fd", "#60a5fa"),
main = "Iris measurements",
ylab = "Centimetres", las = 2)Un axe logarithmique facilite la comparaison de distributions positives très asymétriques en comprimant les grandes valeurs.

Indiquez log = "y" pour une boîte verticale. Les logarithmes n’étant pas définis pour les valeurs nulles ou négatives, vérifiez les données avant cette transformation.
set.seed(42)
group <- rep(c("A", "B", "C"), each = 60)
value <- rlnorm(180, meanlog = rep(c(1, 1.5, 2), each = 60))
boxplot(value ~ group, log = "y", col = "#93c5fd",
main = "Skewed data on a log scale", ylab = "Value (log scale)")Réordonner les catégories selon une statistique de synthèse révèle des classements et des structures que l’ordre alphabétique peut masquer.

Utilisez reorder() dans la formule pour trier les groupes selon leur médiane. C’est particulièrement utile lorsque le graphique comporte de nombreuses catégories.
set.seed(42)
data <- data.frame(
group = rep(c("North", "South", "East", "West"), each = 45),
value = rnorm(180, rep(c(7, 4, 6, 5), each = 45))
)
boxplot(value ~ reorder(group, value, median), data = data,
col = "#93c5fd", xlab = "Group ordered by median",
ylab = "Value")Les marqueurs de moyenne complètent le trait de médiane et peuvent révéler une asymétrie lorsque les deux mesures de tendance centrale diffèrent.

Calculez les moyennes par groupe avec tapply(), puis ajoutez-les aux positions des boîtes correspondantes. Utilisez un symbole distinct et expliquez-le dans une légende.
boxplot(Sepal.Length ~ Species, data = iris,
col = "#dbeafe", main = "Medians and means",
ylab = "Centimetres")
means <- tapply(iris$Sepal.Length, iris$Species, mean)
points(seq_along(means), means, pch = 23,
bg = "#f59e0b", col = "#92400e", cex = 1.4)
legend("topleft", "Mean", pch = 23, pt.bg = "#f59e0b", bty = "n")ggplot2 construit les boîtes par couches, ce qui facilite l’association des variables à la position, au remplissage et aux autres propriétés visuelles.

geom_boxplot() calcule automatiquement le résumé statistique à cinq nombres. Ajoutez geom_jitter() pour montrer également les observations sous-jacentes.
install.packages("ggplot2") # Run once
library(ggplot2)
ggplot(iris, aes(x = Species, y = Sepal.Length, fill = Species)) +
geom_boxplot(width = 0.65, show.legend = FALSE) +
labs(title = "Sepal length by species",
x = "Species", y = "Centimetres") +
theme_minimal()Une boîte plotly ajoute des détails au survol, le zoom, le déplacement de la vue et, si souhaité, l’affichage des observations individuelles.

plot_ly() produit un composant HTML interactif. Indiquer boxpoints = "all" affiche chaque observation à côté du résumé statistique.
install.packages("plotly") # Run once
library(plotly)
plot_ly(iris, x = ~Species, y = ~Sepal.Length,
color = ~Species, type = "box",
boxpoints = "all", jitter = 0.3, pointpos = 0) %>%
layout(title = "Interactive boxplot",
xaxis = list(title = "Species"),
yaxis = list(title = "Centimetres"))