HOWTO · Seaborn
Comment créer un diagramme en violon avec Seaborn
Ce tutoriel montre comment créer un diagramme en violon à l'aide du module Seaborn en Python
Sur cette page
Un diagramme en violon Seaborn représente la distribution estimée d’une variable numérique. Sa largeur indique la densité : les zones plus larges correspondent à une densité estimée plus élevée autour des valeurs concernées. Les marques intérieures résument les données ; elles ne montrent pas chaque observation. La forme peut suggérer plusieurs pics, mais il faut l’interpréter en tenant compte de la taille de l’échantillon et des données sous-jacentes.
Comprendre ce que montre un diagramme en violon
Un diagramme en violon associe une forme de densité à des marques récapitulatives facultatives. La densité est estimée à partir des observations : il s’agit donc d’une représentation lissée, et non d’un histogramme ni d’un ensemble de points bruts. Selon le réglage inner, les marques intérieures peuvent afficher une boîte, les quartiles, un trait pour chaque observation ou aucun résumé.
Ce graphique permet de comparer la forme et la dispersion de distributions numériques. À lui seul, il n’explique pas pourquoi les données ont cette forme. Avec un petit échantillon, la densité estimée peut sembler plus précise ou détaillée que ne le permettent les observations.
Tracer une variable unique
Transmettez une séquence numérique à violinplot() pour tracer une variable. Cet exemple autonome utilise directement une liste Python : aucune conversion en tableau n’est nécessaire. Installez Seaborn et Matplotlib dans votre environnement Python avant de l’exécuter. Le code crée un objet Axes contenant la distribution ; il n’affiche aucun texte.
import matplotlib.pyplot as plt
import seaborn as sns
values = [4, 5, 5, 6, 6, 7, 8, 8, 9, 10]
ax = sns.violinplot(y=values, inner="quartile", color="skyblue")
ax.set_ylabel("Value")
ax.set_title("Distribution of values")
plt.show()
L’axe vertical représente les valeurs. Une partie plus large du violon indique une concentration estimée plus élevée autour de cette valeur. Si l’échantillon est petit, examinez aussi les observations, et pas seulement la forme lissée.
Comparer des distributions par catégorie
Pour comparer des catégories, indiquez la colonne numérique avec y et la colonne de catégories avec x. L’exemple utilise un DataFrame pandas et associe Price à y et Product à x : l’axe des x comporte donc une catégorie par produit. L’appel ne contient pas d’argument hue et n’ajoute aucun regroupement par jour.
import pandas as pd
import seaborn as sns
prices = pd.DataFrame(
{
"Price": [9, 10, 15, 16, 13, 14, 15, 18, 11, 12, 14, 15, 16, 17, 18, 19],
"Product": ["A"] * 4 + ["B"] * 4 + ["A"] * 4 + ["B"] * 4,
}
)
ax = sns.violinplot(data=prices, x="Product", y="Price")
ax.set_title("Price distribution by product")
Chaque violon résume les prix associés au produit correspondant. Pour ajouter une deuxième dimension de regroupement, associez sa colonne à hue ; chaque niveau de hue est alors distingué au sein des catégories de l’axe des x. Ne décrivez pas un regroupement par jour, par exemple, si les données tracées et les arguments ne l’incluent pas réellement.
Personnaliser un diagramme en violon
L’estimation de densité peut induire en erreur lorsque les observations sont peu nombreuses. Superposez stripplot() pour rendre visibles les valeurs individuelles et les comparer à la forme lissée. Ces points facilitent l’examen de l’échantillon, mais ne rendent pas un petit échantillon plus fiable.
import matplotlib.pyplot as plt
import seaborn as sns
values = [4, 5, 5, 6, 6, 7, 8, 8, 9, 10]
ax = sns.violinplot(y=values, inner=None, color="skyblue")
sns.stripplot(y=values, color="red", ax=ax)
ax.set_ylabel("Value")
plt.show()
Utilisez order pour choisir l’ordre d’affichage des catégories, par exemple order=["B", "A"]. Le paramètre inner contrôle les marques récapitulatives ; les valeurs courantes comprennent "box", "quartile", "stick" et None. Une boîte à moustaches superposée peut apporter un résumé familier, mais elle représente toujours le même échantillon et ne remplace pas l’examen des observations.
Utiliser l’objet renvoyé par le graphique
violinplot() renvoie un objet Matplotlib Axes, qui permet de définir des libellés, des limites et un titre, ou d’ajouter d’autres marques. Par exemple, l’exemple sur une variable unique stocke le résultat dans ax et appelle ax.set_ylabel() et ax.set_title().
Pour un graphique catégoriel au niveau de la figure, utilisez catplot(kind="violin", ...) : cette fonction renvoie un FacetGrid. Cette interface est pratique pour créer des panneaux distincts avec des options telles que row ou col. Choisissez violinplot() pour un graphique au niveau des axes et catplot() lorsque vous avez besoin d’une grille au niveau de la figure.