HOWTO · Seaborn

Come creare un violin plot con Seaborn

Questo tutorial mostra come creare un violin plot usando il modulo Seaborn in Python

In questa pagina

Un violin plot di Seaborn mostra la distribuzione stimata di una variabile numerica. La larghezza rappresenta la densità: le parti più larghe indicano una densità stimata maggiore in prossimità di quei valori. I segni interni riassumono i dati, ma non mostrano tutte le osservazioni. La forma può suggerire la presenza di più picchi, ma va interpretata considerando anche la dimensione del campione e i dati sottostanti.

Che cosa mostra un violin plot

Un violin plot combina una forma che rappresenta la densità con eventuali segni riassuntivi. La densità è stimata a partire dalle osservazioni, quindi offre una rappresentazione smussata, diversa da un istogramma o da un insieme di punti grezzi. A seconda dell’impostazione inner, i segni interni possono mostrare un box, i quartili, un trattino per ogni osservazione oppure nessun riepilogo.

Questo grafico è utile per confrontare la forma e la dispersione di distribuzioni numeriche. Da solo non spiega perché i dati abbiano quella forma; inoltre, con un campione piccolo, la densità stimata può sembrare più precisa o dettagliata di quanto le osservazioni giustifichino.

Tracciare una singola variabile

Passa una sequenza numerica a violinplot() per rappresentare una variabile. Questo esempio autonomo usa direttamente una lista Python, quindi non serve convertirla in un array. Prima di eseguirlo, installa Seaborn e Matplotlib nell’ambiente Python. Il codice crea un oggetto Axes con la distribuzione e non stampa testo.

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’asse verticale rappresenta i valori. Una parte più larga del violino indica una concentrazione stimata maggiore in prossimità di quel valore. Se il campione è piccolo, esamina le osservazioni oltre alla forma smussata.

Confrontare distribuzioni tra categorie

Per confrontare categorie, passa la colonna numerica tramite y e quella categoriale tramite x. L’esempio usa un DataFrame pandas e assegna Price a y e Product a x, così sull’asse x compare una categoria per ogni prodotto. La chiamata non contiene l’argomento hue e non aggiunge un raggruppamento per giorno.

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")

Ogni violino riassume i prezzi associati al relativo prodotto. Per aggiungere una seconda dimensione di raggruppamento, assegna la sua colonna a hue: ogni livello di hue viene quindi distinto all’interno delle categorie sull’asse x. Non descrivere un raggruppamento, per esempio per giorno, se i dati tracciati e gli argomenti non lo includono effettivamente.

Personalizzare un violin plot

La stima della densità può essere fuorviante quando le osservazioni sono poche. Sovrapponi stripplot() per rendere visibili i singoli valori e confrontarli con la forma smussata. I punti aiutano a esaminare il campione, ma non rendono più affidabili i risultati di un campione piccolo.

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()

Usa order per scegliere l’ordine in cui mostrare le categorie, per esempio order=["B", "A"]. Usa inner per controllare i segni riassuntivi: tra le opzioni comuni ci sono "box", "quartile", "stick" e None. La sovrapposizione di un box plot può aggiungere un riepilogo familiare, ma rappresenta comunque lo stesso campione e non sostituisce l’esame delle osservazioni.

Usare l’oggetto restituito dal grafico

violinplot() restituisce un oggetto Matplotlib Axes, che puoi usare per impostare etichette, limiti e titolo oppure per aggiungere altri segni. Per esempio, nell’esempio con una singola variabile il risultato viene assegnato ad ax, a cui si applicano ax.set_ylabel() e ax.set_title().

Per un grafico categoriale a livello di figura, usa catplot(kind="violin", ...): restituisce un FacetGrid. Questa interfaccia è utile quando vuoi creare pannelli separati con opzioni come row o col. Scegli violinplot() per un grafico a livello di Axes e catplot() quando ti serve la griglia a livello di figura.