Trama de viol铆n de Matplotlib – Tutorial y ejemplos

    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 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.

    .

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *