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 *