Violin Plot

Violin Plot

Categoría Distribución

Qué es

Combinación de Box Plot y Density Plot: muestra la distribución completa de los datos con una curva de densidad espejada, más un resumen estadístico interno.

Para qué sirve

Para comparar distribuciones entre grupos cuando la forma de la distribución importa tanto como los estadísticos de resumen.

Cómo leerlo

Anatomía

La idea central es fusionar dos herramientas que normalmente viven por separado: el resumen de cinco números de una distribución (mínimo, cuartiles, mediana, máximo) y la traza de densidad, que muestra la forma completa de esa distribución. La silueta del violín es una estimación de densidad reflejada en espejo a ambos lados de un eje central —el ancho en cualquier punto de esa escala es proporcional a cuántos datos hay cerca de ese valor—, así que puede revelar bimodalidad o multimodalidad que un resumen de cinco números corriente no puede mostrar: dos grupos superpuestos se ven como dos ensanchamientos distintos, no como una sola caja homogénea. La caja resumen se dibuja intacta en el centro, sin perder ninguno de sus componentes: la caja es el rango intercuartil, la línea interna es la mediana, los bigotes llegan hasta 1.5 veces ese rango. Los dos lados del violín son matemáticamente idénticos —la duplicación no añade información nueva, solo facilita ver la forma completa de un vistazo.

Cuerpo de un violín visto de frente, con la doble curva de cintura entre los bouts superior e inferior: la silueta simétrica que un violin plot imita, ancha en los extremos y angosta en el centro

Por qué funciona

Fundamento perceptivo

Revela la forma completa de la distribución (bimodalidad, asimetría) que el Box Plot oculta. Es más honesto con los datos.

Errores comunes

  • Requiere suficientes datos

    necesita al menos 30-50 observaciones por grupo para que la estimación de densidad sea significativa, porque con pocos datos la curva resulta artificial.

Dónde se usa

Contextos de aplicación

Distribución de salarios por industria
01

Distribución de salarios por industria

La silueta muestra dónde se concentran los sueldos de cada rubro.

Puntuaciones por grupo experimental
02

Puntuaciones por grupo experimental

Formas bimodales o sesgadas que un box plot no deja ver.

Resultados de mediciones de laboratorio
03

Resultados de mediciones de laboratorio

La densidad completa de cada lote de mediciones, lado a lado.

Cómo construirlo

El mismo gráfico, en 11 librerías open source

Cada librería resuelve las mismas decisiones de diseño, como la escala, el espaciado entre barras o la inserción de la etiqueta de valor, de un modo distinto. Algunas las automatizan; otras las dejan explícitas en el código, a criterio de quien lo escribe. Comparar once implementaciones con los mismos datos y el mismo color de marca aísla esa diferencia, que de otro modo queda oculta detrás de estilos visuales distintos.

Matplotlib License (estilo BSD)
Matplotlib: gráfico de barras

Distribución del ingreso mensual líquido en Chile por categoría en el empleo, 2024 (INE, ESI 2024) —el mismo fundamento que el ejemplo principal de esta ficha: el INE solo publica media y mediana por categoría, así que cada curva es un ajuste log-normal a esas dos cifras reales, muestreado en 120 puntos deterministas (no aleatorios) por grupo. Cinco librerías (matplotlib, seaborn, plotnine, Plotly, Vega-Lite) calculan su propia densidad (KDE) nativa a partir de esos valores; las otras seis usan la misma función kde() manual, un kernel gaussiano con ancho de banda de Silverman. ax.violinplot() es nativo —calcula su propio KDE a partir de los valores individuales, pero colorear cada silueta por separado requiere iterar "bodies" a mano.

import matplotlib.pyplot as plt

# ax.violinplot() es nativo -- calcula su propio KDE (equivalente a
# gaussian_kde de scipy) a partir de los valores individuales, pero
# colorear cada silueta por separado requiere iterar "bodies" a mano.
parts = ax.violinplot(datasets, showmedians=True)
for body, color in zip(parts["bodies"], colores):
    body.set_facecolor(color); body.set_alpha(0.82)
ax.set_xticks(range(1, len(grupos) + 1)); ax.set_xticklabels(grupos)
plt.show()

No disponible en esta librería

ApexCharts

No tiene un tipo de violín nativo ni una API de bajo nivel accesible desde fuera (como el renderItem de ECharts o los plugins de Chart.js) para dibujar un polígono de silueta a mano.

Herramientas para construirlo

No-code, desktop y plataformas web, con su licencia visible, abierta o comercial.

No-code
Observable Freemium
JavaScript
D3.js Open SourceVega-Lite Open Source
Python
Plotly Open SourceMatplotlib Open SourceSeaborn Open SourceAltair Open Source
R
ggplot2 Open Source

Con datos reales

Ejemplos de uso.

Gráficos relacionados

Variantes y alternativas cercanas.