Matplotlib Violin Plot - Tutorial y ejemplos

En este tutorial, repasaremos cómo trazar un diagrama de violín en Matplotlib y Python. Repasaremos todo lo que necesita saber para trazar y personalizar Violin Plots.

Introducción

Hay muchas bibliotecas de visualización de datos en Python, pero Matplotlib es la biblioteca más popular de todas. La popularidad de Matplotlib se debe a su confiabilidad y utilidad: es capaz de crear gráficos simples y complejos con poco código. También puede personalizar las tramas de varias formas.

En este tutorial, cubriremos cómo trazar diagramas de violín en Matplotlib.

Los diagramas de violín se utilizan para visualizar distribuciones de datos, mostrando el rango, la mediana y la distribución de los datos.

Los diagramas de violín muestran las mismas estadísticas de resumen que los diagramas de caja, pero también incluyen Estimaciones de densidad del kernel que representan la forma/distribución de los datos.

Importación de datos

Antes de que podamos crear un gráfico de violín, necesitaremos algunos datos para trazar. Usaremos el Conjunto de datos de Gapminder.

Comenzaremos importando las bibliotecas que necesitamos, que incluyen Pandas y Matplotlib:

1
2
import pandas as pd
import matplotlib.pyplot as plt

Verificaremos para asegurarnos de que no falten entradas de datos e imprimiremos el encabezado del conjunto de datos para asegurarnos de que los datos se hayan cargado correctamente. Asegúrese de establecer el tipo de codificación en ISO-8859-1:

1
2
3
dataframe = pd.read_csv("gapminder_full.csv", error_bad_lines=False, encoding="ISO-8859-1")
print(dataframe.head())
print(dataframe.isnull().values.any())
1
2
3
4
5
6
       country  year  population continent  life_exp     gdp_cap
0  Afghanistan  1952     8425333      Asia    28.801  779.445314
1  Afghanistan  1957     9240934      Asia    30.332  820.853030
2  Afghanistan  1962    10267083      Asia    31.997  853.100710
3  Afghanistan  1967    11537966      Asia    34.020  836.197138
4  Afghanistan  1972    13079460      Asia    36.088  739.981106

Trazado de un diagrama de violín en Matplotlib

Para crear un Violin Plot en Matplotlib, llamamos a la función violinplot() en la instancia Axes o en la propia instancia PyPlot:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import pandas as pd
import matplotlib.pyplot as plt

dataframe = pd.read_csv("gapminder_full.csv", error_bad_lines=False, encoding="ISO-8859-1")

population = dataframe.population
life_exp = dataframe.life_exp
gdp_cap = dataframe.gdp_cap

# Extract Figure and Axes instance
fig, ax = plt.subplots()

# Create a plot
ax.violinplot([population, life_exp, gdp_cap])

# Add title
ax.set_title('Violin Plot')
plt.show()

matplotlib violin plot

Cuando creamos el primer gráfico, podemos ver la distribución de nuestros datos, pero también notaremos algunos problemas. Debido a que la escala de las características es tan diferente, es prácticamente imposible la distribución de las columnas Esperanza de vida y PIB.

Por esta razón, queremos graficar cada columna en su propia subparcela.

Ordenaremos y dividiremos un poco el marco de datos para facilitar la comparación de las columnas del conjunto de datos. Agruparemos el marco de datos por "país" y seleccionaremos solo las entradas más recientes/últimas para cada uno de los países.

Luego, ordenaremos por población y eliminaremos las entradas con las poblaciones más grandes (los valores atípicos de la población grande), de modo que el resto del marco de datos esté en un rango más similar y las comparaciones sean más fáciles:

1
2
3
4
dataframe = dataframe.groupby("country").last()
dataframe = dataframe.sort_values(by=["population"], ascending=False)
dataframe = dataframe.iloc[10:]
print(dataframe)

Ahora, el marco de datos se parece a:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
                       year  population continent  life_exp       gdp_cap
country
Philippines            2007    91077287      Asia    71.688   3190.481016
Vietnam                2007    85262356      Asia    74.249   2441.576404
Germany                2007    82400996    Europe    79.406  32170.374420
Egypt                  2007    80264543    Africa    71.338   5581.180998
Ethiopia               2007    76511887    Africa    52.947    690.805576
...                     ...         ...       ...       ...           ...
Montenegro             2007      684736    Europe    74.543   9253.896111
Equatorial Guinea      2007      551201    Africa    51.579  12154.089750
Djibouti               2007      496374    Africa    54.791   2082.481567
Iceland                2007      301931    Europe    81.757  36180.789190
Sao Tome and Principe  2007      199579    Africa    65.528   1598.435089

¡Excelente! Ahora podemos crear una figura y tres objetos de ejes con la función subplots(). Cada uno de estos ejes tendrá una trama de violín. Dado que ahora estamos trabajando en una escala mucho más manejable, activemos también el argumento showmedians configurándolo en True.

Esto marcará una línea horizontal en la mediana de nuestras parcelas de violín:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
# Create figure with three axes
fig, (ax1, ax2, ax3) = plt.subplots(nrows=1, ncols=3)

# Plot violin plot on axes 1
ax1.violinplot(dataframe.population, showmedians=True)
ax1.set_title('Population')

# Plot violin plot on axes 2
ax2.violinplot(life_exp, showmedians=True)
ax2.set_title('Life Expectancy')

# Plot violin plot on axes 3
ax3.violinplot(gdp_cap, showmedians=True)
ax3.set_title('GDP Per Cap')

plt.show()

Ejecutar este código ahora nos da:

matplotlib violin plot show medianas

Ahora podemos tener una buena idea de la distribución de nuestros datos. La línea horizontal central en los violines es donde se ubica la mediana de nuestros datos, y los valores mínimo y máximo se indican mediante las posiciones de la línea en el eje Y.

Personalización de diagramas de violín en Matplotlib

Ahora, echemos un vistazo a cómo podemos personalizar Violin Plots.

Adición de marcas X e Y

Como puede ver, si bien los gráficos se generaron con éxito, sin etiquetas de marca en los ejes X e Y, puede ser difícil interpretar el gráfico. Los humanos interpretan los valores categóricos mucho más fácilmente que los valores numéricos.

Podemos personalizar el gráfico y agregar etiquetas al eje X usando la función set_xticks():

1
2
3
4
5
6
fig, ax = plt.subplots()
ax.violinplot(gdp_cap, showmedians=True)
ax.set_title('violin plot')
ax.set_xticks([1])
ax.set_xticklabels(["Country GDP",])
plt.show()

Esto resulta en:

agregue marcas x e y a las gráficas de violín en matplotlib

Aquí, configuramos los X-ticks de un rango a uno solo, en el medio, y agregamos una etiqueta que es fácil de interpretar.

Trazado de un gráfico de violín horizontal en Matplotlib

Si quisiéramos, también podríamos cambiar la orientación de la trama alterando el parámetro vert. vert controla si el gráfico se renderiza verticalmente o no y se establece en True de forma predeterminada:

1
2
3
4
5
6
7
fig, ax = plt.subplots()
ax.violinplot(gdp_cap, showmedians=True, vert=False)
ax.set_title('violin plot')
ax.set_yticks([1])
ax.set_yticklabels(["Country GDP",])
ax.tick_params(axis='y', labelrotation = 90)
plt.show()

plot horizontal violin plot in matplotlib

Aquí, hemos establecido las etiquetas de marca del eje Y y su frecuencia, en lugar del eje X. También hemos girado las etiquetas 90 grados.

Mostrar medias de conjuntos de datos en diagramas de violín

También tenemos otros parámetros de personalización disponibles. Podemos optar por mostrar las medias, además de las medianas, usando el parámetro showmean.

Intentemos visualizar las medias además de las medianas:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
fig, (ax1, ax2, ax3) = plt.subplots(nrows=1, ncols=3)
ax1.violinplot(population, showmedians=True, showmeans=True, vert=False)
ax1.set_title('Population')

ax2.violinplot(life_exp, showmedians=True, showmeans=True, vert=False)
ax2.set_title('Life Expectancy')

ax3.violinplot(gdp_cap, showmedians=True, showmeans=True, vert=False)
ax3.set_title('GDP Per Cap')
plt.show()

mostrar los medios del conjunto de datos en el diagrama de violín en matplotlib

Sin embargo, tenga en cuenta que dado que las medianas y las medias se ven esencialmente iguales, puede no estar claro qué línea vertical aquí se refiere a una mediana y cuál a una media.

Personalización de la estimación de la densidad del kernel para gráficos de violín

También podemos alterar cuántos puntos de datos considera el modelo al crear las estimaciones de densidad del núcleo gaussiano, alterando el parámetro “puntos”.

El número de puntos considerados es 100 por defecto. Al proporcionar a la función menos puntos de datos para estimar, podemos obtener una distribución de datos menos representativa.

Cambiemos este número a, digamos, 10:

1
2
3
4
5
6
fig, ax = plt.subplots()
ax.violinplot(gdp_cap, showmedians=True, points=10)
ax.set_title('violin plot')
ax.set_xticks([1])
ax.set_xticklabels(["Country GDP",])
plt.show()

personalizar la estimación de la densidad del núcleo para los diagramas de violín en matplotlib

Observe que la forma del violín es menos uniforme ya que se han muestreado menos puntos.

Por lo general, querrá aumentar la cantidad de puntos utilizados para tener una mejor idea de la distribución. Este podría no ser siempre el caso, si 100 es simplemente suficiente. Grafiquemos un diagrama de violín muestreado de 10 puntos, 100 puntos y 500 puntos:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
fig, (ax1, ax2, ax3) = plt.subplots(nrows=1, ncols=3)
ax1.violinplot(gdp_cap, showmedians=True, points=10)
ax1.set_title('GDP Per Cap, 10p')

ax2.violinplot(gdp_cap, showmedians=True, points=100)
ax2.set_title('GDP Per Cap, 100p')

ax3.violinplot(gdp_cap, showmedians=True, points=500)
ax3.set_title('GDP Per Cap, 500p')
plt.show()

Esto resulta en:

varios tamaños de muestra de KDE para plot de violín

No hay ninguna diferencia obvia entre la segunda y la tercera trama, sin embargo, hay una significativa entre la primera y la segunda.

Conclusión

En este tutorial, hemos repasado varias formas de trazar un diagrama de violín usando Matplotlib y Python. También hemos cubierto cómo personalizarlos agregando marcas X e Y, trazando horizontalmente, mostrando las medias del conjunto de datos y alterando el muestreo de puntos de KDE.

Si está interesado en Visualización de datos y no sabe por dónde empezar, asegúrese de consultar nuestro paquete de libros en [Visualización de datos en Python](https://gum.co/data-visualization -en-paquete-de-libros-de-python):

Visualización de datos en Python Vuélvase peligroso con la visualización de datos ✅ Garantía de devolución de dinero de 30 días sin preguntas ✅ Principiante a Avanzado ✅ Actualizado periódicamente de forma gratuita (última actualización en abril de 2021) ✅ Actualizado con recursos y guías adicionales

Visualización de datos en Python con Matplotlib y Pandas es un libro diseñado para llevar a los principiantes absolutos a Pandas y Matplotlib, con conocimientos básicos de Python, y permitirles construir una base sólida para el trabajo avanzado con estas bibliotecas, desde gráficos simples. a gráficos 3D animados con botones interactivos.

Sirve como una guía detallada que le enseñará todo lo que necesita saber sobre Pandas y Matplotlib, incluido cómo construir tipos de gráficos que no están integrados en la propia biblioteca.

Visualización de datos en Python, un libro para desarrolladores principiantes e intermedios de Python, lo guía a través de la manipulación de datos simple con Pandas, cubre bibliotecas de trazado centrales como Matplotlib y Seaborn, y le muestra cómo aprovechar las bibliotecas declarativas y experimentales. como Altair. Más específicamente, a lo largo de 11 capítulos, este libro cubre 9 bibliotecas de Python: Pandas, Matplotlib, Seaborn, Bokeh, Altair, Plotly, GGPlot, GeoPandas y VisPy.

Sirve como una guía práctica única para la visualización de datos, en una plétora de herramientas que podría usar en su carrera.