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:
# 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.
Cambiemos 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.
Data 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.
.