Violin plot

El violin plot combina la funcionalidad del box plot -mostrando los cuartiles de la distribución- y la de la estimación de densidad kernel. Para crearla podemos recurrir a la función a nivel de figura seaborn.catplot con el argumento kind = "violin" o a la función a nivel de ejes seaborn.violinplot. Ésta es una forma muy atractiva de mostrar la distribución de un conjunto de datos con respecto a una variable categórica, pero ten en cuenta que, para conjuntos de datos pequeños, la estimación de densidad kernel puede no transmitir con detalle el perfil real de los datos, mostrándolo mucho más suave de lo que realmente es:

sns.catplot(x = "day", y = "total_bill", data = tips, kind = "violin");

Violin plot

Seguimos viendo la caja -ahora reducida a una linea negra de cierto grosos en el centro de cada "violín". En el interior de la línea vemos un pequeño punto blanco que representa la mediana y, lógicamente, los límites de la línea más gruesa representan los cuartiles Q1 y Q3.

En el ejemplo visto, la gráfica se ha mostrado vertical pues hemos dado como primer argumento la variable categórica. Basta intercambiar los dos primeros argumentos para cambiar la forma de la gráfica:

sns.catplot(x = "total_bill", y = "day", data = tips, kind = "violin");

Violin plot

Los parámetros disponibles en este tipo de gráficas proceden del enfoque "box plot" y del enfoque "kde". Así, podemos determinar el "bandwidth" que vimos en la gráfica kdeplot usando el parámetro bw. Este parámetro controlaba el grado de ajuste de la KDE a los datos:

sns.catplot(x = "day", y = "total_bill", data = tips, kind = "violin", bw = 0.25);

Violin plot

El parámetro hue nos permite, aquí también, crear nuevos violines para cada uno de los valores de la variable categórica que se indique:

sns.catplot(x = "day", y = "total_bill", data = tips, kind = "violin", hue = "sex");

Violin plot

Al utilizar el parámetro hue para establecer un criterio de segmentación, cuando éste toma solo dos valores -como en el ejemplo anterior-, es posible agregar el parámetro split con el valor True para, en lugar de duplicar los violines, separar cada uno en dos mitades mostrando la distribución de los datos para cada valor de la variable categórica. Es decir, la gráfica anterior es semejante a la siguiente:

sns.catplot(x = "day", y = "total_bill", data = tips, kind = "violin", hue = "sex", split = True);

Violin plot

Si la variable categórica usada tomase más de dos valores, la función devolvería un error.

Por último, es necesario comentar que el interior del violín puede ser personalizado utilizando el parámetro inner, parámetro que puede tomar los valores “box”, “quartile”, “point”, “stick” o None. El valor por defecto es "box", pero cambiándolo a "quartile", por ejemplo, se muestran líneas horizontales señalando la posición de los cuartiles. Se muestra a continuación el resultado de utilizar las cuatro opciones comentadas usando la función equivalente seaborn.violinplot:

fig, ax = plt.subplots(2, 2)
fig.set_size_inches(10, 7)
sns.violinplot(x = "day", y = "total_bill", data = tips, kind = "violin", inner = "box", ax = ax[0, 0]);
sns.violinplot(x = "day", y = "total_bill", data = tips, kind = "violin", inner = "quartile", ax = ax[0, 1]);
sns.violinplot(x = "day", y = "total_bill", data = tips, kind = "violin", inner = "point", ax = ax[1, 0]);
sns.violinplot(x = "day", y = "total_bill", data = tips, kind = "violin", inner = "stick", ax = ax[1, 1]);

Violin plot

La opción inner = None simplemente oculta la caja en el interior de cada violín.