Introducción
Contenido
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 los gráficos de diversas formas.
En este tutorial, cubriremos cómo trazar tramas de violín en Matplotlib.
Los gráficos 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 de granos que representan la forma / distribución de los datos.
Importación de datos
Antes de que podamos crear un diagrama de violín, necesitaremos algunos datos para trazar. Usaremos el Conjunto de datos Gapminder.
Comenzaremos importando las bibliotecas que necesitamos, que incluyen Pandas y Matplotlib:
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
:
dataframe = pd.read_csv("gapminder_full.csv", error_bad_lines=False, encoding="ISO-8859-1")
print(dataframe.head())
print(dataframe.isnull().values.any())
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
Trazar una trama de violín en Matplotlib
Para crear una trama de violín en Matplotlib, llamamos al violinplot()
función en el Axes
instancia, o la propia instancia de PyPlot:
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()
Cuando creamos la primera gráfica, 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 trazar cada columna en su propia subparcela.
Haremos una pequeña clasificación y división del 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:
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:
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 objetos de tres ejes con el subplots()
función. 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 la showmedians
argumento configurándolo en True
.
Esto marcará una línea horizontal en la mediana de nuestras parcelas de violín:
Te puede interesar:Búsqueda binaria en JavaScript# 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 produce:
Ahora podemos tener una buena idea de la distribución de nuestros datos. La línea horizontal central en los violines es donde se encuentra 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 tramas de violín en Matplotlib
Ahora, echemos un vistazo a cómo podemos personalizar las tramas de violín.
Agregar marcas X e Y
Como puede ver, si bien los gráficos se han generado con éxito, sin etiquetas de marca en los ejes X e Y, puede resultar difícil interpretar el gráfico. Los seres humanos interpretan los valores categóricos con mucha más facilidad que los valores numéricos.
Podemos personalizar el gráfico y agregar etiquetas al eje X usando el set_xticks()
función:
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:
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 una trama de violín horizontal en Matplotlib
Si quisiéramos, también podríamos cambiar la orientación de la trama alterando el vert
parámetro. vert
controla si el gráfico se representa verticalmente o no y se establece en True
por defecto:
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()
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.
Visualización de medias de conjuntos de datos en gráficos de violín
También tenemos otros parámetros de personalización disponibles. Podemos optar por mostrar las medias, además de las medianas, utilizando el showmean
parámetro.
Intentemos visualizar las medias además de las medianas:
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()
Sin embargo, tenga en cuenta que dado que las medianas y las medias se ven esencialmente iguales, es posible que no esté claro qué línea vertical aquí se refiere a una mediana y cuál a una media.
Personalización de la estimación de densidad de kernel para diagramas 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, modificando el points
parámetro.
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.
Te puede interesar:Git: fusionar rama en maestroCambiemos este número a, digamos, 10:
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()
Observe que la forma del violín es menos suave ya que se han muestreado menos puntos.
Normalmente, 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. Tracemos un diagrama de violín muestreado de 10 puntos, 100 puntos y 500 puntos:
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:
Sin embargo, no hay ninguna diferencia obvia entre la segunda y la tercera trama, hay una significativa entre la primera y la segunda.
Conclusión
En este tutorial, hemos repasado varias formas de trazar una trama de violín usando Matplotlib y Python. También cubrimos cómo personalizarlos agregando marcas X e Y, trazando horizontalmente, mostrando las medias del conjunto de datos y modificando el muestreo de puntos de KDE.
Si está interesado en la visualización de datos y no sabe por dónde empezar, asegúrese de consultar nuestro libro sobre Visualización de datos en Python.
Te puede interesar:Comparando cadenas con JavaData Visualization in Python, un libro para desarrolladores de Python principiantes e intermedios, lo guiará a través de la manipulación simple de datos con Pandas, cubrirá bibliotecas de trazado centrales como Matplotlib y Seaborn, y le mostrará cómo aprovechar las bibliotecas declarativas y experimentales como Altair.
Visualización de datos en Python
¡Comprenda mejor sus datos con visualizaciones! Con 340 páginas, aprenderá los entresijos de la visualización de datos en Python con bibliotecas populares como Matplotlib, Seaborn, Bokeh y más.
.