HOWTO · Seaborn

Cómo crear un gráfico de violín con Seaborn

Este tutorial muestra cómo crear un gráfico de violín usando el módulo Seaborn en Python

En esta página

Un gráfico de violín de Seaborn muestra la distribución estimada de una variable numérica. Su ancho representa la densidad: las zonas más anchas indican una densidad estimada mayor alrededor de esos valores. Las marcas interiores resumen los datos; no muestran todas las observaciones. La forma puede sugerir varios picos, pero conviene interpretarla teniendo en cuenta el tamaño de la muestra y los datos subyacentes.

Qué muestra un gráfico de violín

Un gráfico de violín combina una forma de densidad con marcas de resumen opcionales. La densidad se estima a partir de las observaciones, por lo que ofrece una vista suavizada, no un histograma ni una colección de puntos originales. Según el valor de inner, las marcas interiores pueden mostrar una caja, los cuartiles, una marca por observación o ningún resumen.

Este gráfico sirve para comparar la forma y la dispersión de distribuciones numéricas. Por sí solo no permite determinar por qué los datos tienen esa forma. Además, con una muestra pequeña, la densidad estimada puede parecer más precisa o detallada de lo que justifican las observaciones.

Graficar una variable

Pasa una secuencia numérica a violinplot() para graficar una variable. Este ejemplo autónomo usa directamente una lista de Python, por lo que no hace falta convertirla en un array. Antes de ejecutarlo, instala Seaborn y Matplotlib en tu entorno de Python. El código crea un objeto Axes con la distribución, pero no imprime texto.

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

El eje vertical representa los valores. Una parte más ancha del violín indica una concentración estimada mayor alrededor de ese valor. Si la muestra es pequeña, examina las observaciones además de la forma suavizada.

Comparar distribuciones entre categorías

Para comparar categorías, pasa la columna numérica mediante y y la columna categórica mediante x. El ejemplo usa un DataFrame de pandas y asigna Price a y y Product a x, de modo que el eje x muestra una categoría por producto. La llamada no incluye el argumento hue ni añade una agrupación por día.

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

Cada violín resume los precios correspondientes a ese producto. Para añadir una segunda dimensión de agrupación, asigna su columna a hue; así, cada nivel de hue se distingue dentro de las categorías del eje x. No describas una agrupación por día si los datos representados y los argumentos no la incluyen.

Personalizar un gráfico de violín

La estimación de densidad puede resultar engañosa cuando hay pocas observaciones. Superpón stripplot() para mostrar los valores individuales y compararlos con la forma suavizada. Los puntos ayudan a examinar la muestra, pero no hacen que una muestra pequeña sea más 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()

Usa order para elegir el orden en que se muestran las categorías; por ejemplo, order=["B", "A"]. Usa inner para controlar las marcas de resumen. Algunas opciones habituales son "box", "quartile", "stick" y None. Superponer un diagrama de caja puede añadir un resumen conocido, pero sigue representando la misma muestra y no sustituye el examen de las observaciones.

Usar el objeto de gráfico devuelto

violinplot() devuelve un objeto Matplotlib Axes, que puedes usar para establecer etiquetas, límites y un título, o para añadir otras marcas. Por ejemplo, el ejemplo de una variable guarda el resultado en ax y llama a ax.set_ylabel() y ax.set_title().

Para un gráfico categórico a nivel de figura, usa catplot(kind="violin", ...); devuelve un FacetGrid. Esta interfaz resulta útil si quieres crear paneles separados con opciones como row o col. Elige violinplot() para un gráfico a nivel de ejes y catplot() cuando necesites la cuadrícula a nivel de figura.