HOWTO · Seaborn

BoxPlot Seaborn

Ce tutoriel montre comment créer des boîtes à moustaches à l'aide du module Seaborn en python

Sur cette page

Utilisez seaborn.boxplot() pour résumer une distribution numérique ou comparer des valeurs entre catégories. Indiquez explicitement les colonnes de données afin que Seaborn sache quelle variable placer sur chaque axe. Un diagramme en boîte montre la médiane et l’écart interquartile (IQR) ; avec la règle par défaut pour les moustaches, celles-ci atteignent les observations les plus extrêmes situées à moins de 1,5 IQR de la boîte, tandis que les observations plus éloignées apparaissent sous forme de points individuels.

Schéma annoté d’une boîte à moustaches nommant ses éléments : la boîte s’étend du quartile inférieur au quartile supérieur avec la ligne de la médiane à l’intérieur, les moustaches atteignent les extrêmes inférieur et supérieur, et une valeur au-delà des moustaches apparaît comme un point aberrant unique.

Chaque exemple de cet article utilise les mêmes éléments : la boîte couvre la moitié centrale des données, la ligne à l’intérieur est la médiane, les moustaches marquent l’étendue selon la règle choisie, et tout point au-delà des moustaches est tracé individuellement.

Créer un diagramme en boîte pour une distribution

Placez les mesures dans une colonne d’un DataFrame et associez cette colonne à y. Le rôle des données est ainsi clair et le graphique reçoit un libellé d’axe pertinent. L’exemple ci-dessous utilise des valeurs fixes : les mêmes données sont donc utilisées à chaque exécution.

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

data = pd.DataFrame({"Score": [12, 14, 15, 16, 18, 19, 21, 24]})
ax = sns.boxplot(data=data, y="Score")
ax.set_title("Score distribution")
plt.show()

Boîte à moustaches Seaborn des huit valeurs Score : une seule boîte verticale avec la ligne de la médiane à l’intérieur et des moustaches atteignant les scores le plus bas et le plus élevé.

La ligne à l’intérieur de la boîte indique la médiane. La boîte s’étend du premier au troisième quartile ; sa hauteur représente donc la moitié centrale des observations. Une boîte plus haute signale une plus grande dispersion dans cette partie centrale des données. Les moustaches indiquent l’étendue définie par la règle choisie ; elles n’atteignent pas nécessairement les valeurs minimale et maximale.

Comparer des distributions entre catégories

Associez une catégorie à x et la mesure numérique à y pour afficher une boîte distincte pour chaque catégorie. Dans ce jeu de données, chaque boîte résume le prix (Price) pour un niveau de quantité (Quantity). L’ajout de hue="Product" répartit chaque catégorie en groupes de produits, ce qui facilite leur comparaison pour une même quantité.

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

data = pd.DataFrame(
    {
        "Quantity": [5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8],
        "Price": [9, 10, 15, 16, 13, 14, 15, 18, 11, 12, 14, 15, 16, 17, 18, 19],
        "Product": ["A", "A", "A", "A", "B", "B", "B", "B"] * 2,
    }
)
ax = sns.boxplot(data=data, x="Quantity", y="Price", hue="Product")
ax.set_title("Price by quantity and product")
plt.show()

Boîtes à moustaches Seaborn de Price pour les niveaux de Quantity de 5 à 8, séparées par Product A et Product B ; les boîtes de Product B sont plus hautes que celles de Product A à chaque quantité.

Utilisez hue lorsque le regroupement supplémentaire répond à une question de comparaison. Si les groupes sont nombreux, les boîtes risquent d’être serrées ; simplifiez les catégories ou créez des graphiques séparés afin que les distributions restent lisibles.

Afficher les observations individuelles avec un strip plot

Un diagramme en boîte condense les données sous forme de statistiques récapitulatives. Superposez seaborn.stripplot() si les lecteurs doivent aussi voir chaque observation. Réutilisez le même axe et les mêmes associations de variables pour les deux couches, puis ajoutez une légère dispersion horizontale afin que les points ayant des valeurs proches ne se chevauchent pas complètement.

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

data = pd.DataFrame({"Score": [12, 14, 15, 16, 18, 19, 21, 24]})
ax = sns.boxplot(data=data, y="Score", color="lightgray")
sns.stripplot(data=data, y="Score", color="darkred", jitter=0.15, ax=ax)
ax.set_title("Scores with individual observations")
plt.show()

La boîte à moustaches de Score en gris clair avec un strip plot rouge foncé superposé, de sorte que chacune des huit observations apparaît comme un point distinct légèrement décalé dans ou à côté de la boîte.

La boîte reste le résumé, tandis que chaque marqueur représente une ligne des données. Avec un jeu de données plus volumineux, les points peuvent se chevaucher ; ajustez leur taille ou leur transparence pour que les zones denses restent lisibles.

Personnaliser le diagramme en boîte

Utilisez les méthodes de Matplotlib pour régler les limites des axes et mettre l’accent sur une plage de valeurs pertinente, linewidth pour modifier l’épaisseur des bordures de la boîte et des moustaches, et palette pour attribuer des couleurs aux catégories. Le paramètre orient contrôle l’orientation ; par exemple, orient="h" demande un graphique horizontal lorsque les associations de variables le permettent. Les limites d’axes ne modifient que la vue affichée : choisissez-les avec soin et gardez une échelle claire pour éviter de masquer des observations pertinentes.

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

data = pd.DataFrame(
    {
        "Quantity": [5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8],
        "Price": [9, 10, 15, 16, 13, 14, 15, 18, 11, 12, 14, 15, 16, 17, 18, 19],
        "Product": ["A", "A", "A", "A", "B", "B", "B", "B"] * 2,
    }
)
ax = sns.boxplot(
    data=data,
    x="Quantity",
    y="Price",
    hue="Product",
    linewidth=2.5,
    palette="Set2",
)
ax.set_ylim(8, 20)
ax.set_title("Customized price comparison")
plt.show()

La comparaison de prix personnalisée avec des bordures de boîte et de moustaches plus épaisses, les couleurs de la palette Set2 pour Product A et Product B, et l’axe y limité à la plage de 8 à 20.

Les couleurs de la palette correspondent aux groupes définis par hue. Pour obtenir des boîtes horizontales, inversez les associations de la catégorie et de la mesure, puis définissez orient="h" ; réglez alors les limites de l’axe avec set_xlim() plutôt qu’avec set_ylim().

Créer un diagramme en boîte avec catplot()

Utilisez catplot() avec kind="box" pour passer par l’interface au niveau de la figure. Cette fonction accepte les mêmes associations explicites de données et peut créer des panneaux distincts avec col ou row lorsqu’une autre variable doit séparer la comparaison. Pour un graphique unique, seaborn.boxplot() est l’option au niveau des axes ; catplot() est pratique lorsque la figure doit être divisée en facettes.

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

data = pd.DataFrame(
    {
        "Quantity": [5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8, 5, 6, 7, 8],
        "Price": [9, 10, 15, 16, 13, 14, 15, 18, 11, 12, 14, 15, 16, 17, 18, 19],
    }
)
grid = sns.catplot(data=data, x="Quantity", y="Price", kind="box")
grid.set_axis_labels("Quantity", "Price")
grid.fig.suptitle("Price by quantity")
plt.show()

catplot au niveau de la figure avec kind réglé sur box : une boîte de Price pour chaque niveau de Quantity de 5 à 8 dans un seul panneau, avec le titre de la figure au-dessus.

Comme catplot() construit la figure entière, il renvoie un objet grille plutôt qu’un seul axe ; définissez les libellés et les titres sur la grille, comme dans l’exemple, au lieu d’appeler ax.set_title().

Corriger une erreur de colonne manquante et régler l’étendue des moustaches

Comme chaque correspondance nomme une colonne du DataFrame, un nom mal orthographié échoue avant que quoi que ce soit ne soit dessiné. Cet appel demande une colonne Scroe que les données ne contiennent pas :

import pandas as pd
import seaborn as sns

data = pd.DataFrame({"Score": [12, 14, 15, 16, 18, 19, 21, 24]})
ax = sns.boxplot(data=data, y="Scroe")

L’appel se termine par cette erreur :

ValueError: Could not interpret value `Scroe` for `y`. An entry with this name does not appear in `data`.

Corrigez le nom pour qu’il corresponde exactement à la colonne — ici, y="Score" — et le même appel dessinera le graphique. Quand l’orthographe correcte n’est pas évidente, affichez data.columns et copiez le nom depuis la liste ; la vérification s’applique de la même façon à x, y et hue.

Les moustaches sont l’autre limite que rencontrent les lecteurs. Ajoutez une valeur éloignée, 60, aux scores : les quartiles bougent à peine (premier quartile 15, médiane 18, troisième quartile 21) et, avec la valeur par défaut whis=1.5, la moustache supérieure s’arrête à 24 tandis que 60 est tracé comme un point isolé au-delà. Passer whis comme une paire de percentiles étire les moustaches jusqu’à ces percentiles des données :

import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

scores = pd.DataFrame({"Score": [12, 14, 15, 16, 18, 19, 21, 24, 60]})
ax = sns.boxplot(data=scores, y="Score", whis=(0, 100))
plt.show()

Avec whis=(0, 100), les moustaches atteignent le minimum 12 et le maximum 60, et aucun point ne reste à l’extérieur. Préférez la valeur par défaut, sauf si l’étendue complète est le message : des moustaches étirées masquent à quel point la valeur extrême est inhabituelle. Notez aussi qu’une colonne vide ne lève pas d’erreur — Seaborn renvoie des axes vides — donc vérifiez le nombre de lignes avant de tracer lorsque les données proviennent d’un pipeline.