Visualización de datos de Python con Matplotlib

La visualización de tendencias de datos es una de las tareas más importantes en la ciencia de datos y el aprendizaje automático. La elección de algoritmos de minería de datos y aprendizaje automático depen...

Introducción

La visualización de tendencias de datos es una de las tareas más importantes en la ciencia de datos y el aprendizaje automático. La elección de los algoritmos de minería de datos y aprendizaje automático depende en gran medida de los patrones identificados en el conjunto de datos durante la fase de visualización de datos. En este artículo, veremos cómo podemos realizar diferentes tipos de visualizaciones de datos en Python. Usaremos biblioteca matplotlib de Python, que es el estándar de facto para la visualización de datos en Python.

El artículo Una breve introducción a Matplotlib para la visualización de datos proporciona una introducción de muy alto nivel a la biblioteca Matplot y explica cómo para dibujar diagramas de dispersión, diagramas de barras, histogramas, etc. En este artículo, exploraremos más funcionalidades de Matplotlib.

Cambio del tamaño de gráfico predeterminado {#cambio de tamaño de gráfico predeterminado}

Lo primero que haremos será cambiar el tamaño de la trama por defecto. De forma predeterminada, el tamaño de los gráficos de Matplotlib es de 6 x 4 pulgadas. El tamaño predeterminado de las parcelas se puede verificar usando este comando:

1
2
3
import matplotlib.pyplot as plt

print(plt.rcParams.get('figure.figsize'))

Para una mejor vista, es posible que deba cambiar el tamaño predeterminado del gráfico de Matplotlib. Para hacerlo puedes usar el siguiente script:

1
2
3
4
fig_size = plt.rcParams["figure.figsize"]
fig_size[0] = 10
fig_size[1] = 8
plt.rcParams["figure.figsize"] = fig_size

La secuencia de comandos anterior cambia el tamaño predeterminado de los gráficos de Matplotlib a 10 x 8 pulgadas.

Comencemos nuestra discusión con un diagrama de línea simple.

Diagrama de líneas

El diagrama de líneas es el diagrama más básico en Matplotlib. Se puede utilizar para trazar cualquier función. Hagamos un gráfico de líneas para la función del cubo. Echa un vistazo al siguiente script:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-10, 9, 20)

y = x ** 3

plt.plot(x, y, 'b')
plt.xlabel('X axis')
plt.ylabel('Y axis')
plt.title('Cube Function')
plt.show()

En el script anterior, primero importamos la clase pyplot de la biblioteca Matplotlib. Tenemos dos matrices numpy x e y en nuestro script. Usamos el método linspace de la biblioteca numpy para crear una lista de 20 números entre -10 y 9 positivo. Luego tomamos la raíz cúbica de todos los números y asignamos el resultado a la variable y. Para trazar dos matrices numpy, simplemente puede pasarlas al método plot de la clase pyplot de la biblioteca Matplotlib. Puede usar los atributos xlabel, ylabel y title de la clase pyplot para etiquetar el eje x, el eje y y el título del gráfico. El resultado del script anterior se parece a esto:

Producción:

{.img-responsive}

Creación de varias parcelas

De hecho, puede crear más de un gráfico en un lienzo usando Matplotlib. Para hacerlo, debe usar la función subplot que especifica la ubicación y el número de parcela. Echa un vistazo al siguiente ejemplo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-10, 9, 20)

y = x ** 3

plt.subplot(2,2,1)
plt.plot(x, y, 'b*-')
plt.subplot(2,2,2)
plt.plot(x, y, 'y--')
plt.subplot(2,2,3)
plt.plot(x, y, 'b*-')
plt.subplot(2,2,4)
plt.plot(x, y, 'y--')

El primer atributo de la función subparcela son las filas que tendrán las subparcelas y el segundo parámetro especifica el número de columnas para la subparcela. Un valor de 2,2 especies que habrá cuatro gráficos. El tercer argumento es la posición en la que se mostrará el gráfico. Las posiciones comienzan desde la parte superior izquierda. El gráfico con la posición 1 se mostrará en la primera fila y la primera columna. De manera similar, el gráfico con la posición 2 se mostrará en la primera fila y en la segunda columna.

Echa un vistazo al tercer argumento de la función plot. Este argumento define la forma y el color del marcador en el gráfico.

Producción:

{.img-responsive}

Trazado en forma orientada a objetos {#trazado en forma orientada a objetos}

En la sección anterior usamos el método plot de la clase pyplot y le pasamos valores para las coordenadas x e y junto con las etiquetas. Sin embargo, en Python se puede dibujar el mismo gráfico de forma orientada a objetos. Echa un vistazo al siguiente script:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-10, 9, 20)

y = x ** 3

figure = plt.figure()

axes = figure.add_axes([0.2, 0.2, 0.8, 0.8])

El método figure llamado usando la clase pyplot devuelve el objeto figure. Puede llamar al método add_axes usando este objeto. Los parámetros pasados ​​al método add_axes son la distancia desde la izquierda y la parte inferior del eje predeterminado y el ancho y alto del eje, respectivamente. El valor de estos parámetros debe mencionarse como una fracción del tamaño de figura predeterminado. Ejecutar el script anterior crea un eje vacío como se muestra en la siguiente figura:

El resultado del script anterior se ve así:

{.img-responsive}

Tenemos nuestro eje, ahora podemos agregar datos y etiquetas a este eje. Para agregar los datos, necesitamos llamar a la función plot y pasarle nuestros datos. De manera similar, para crear etiquetas para el eje x, el eje y y para el título, podemos usar las funciones set_xlabel, set_ylabel y set_title como se muestra a continuación:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-10, 9, 20)

y = x ** 3

figure = plt.figure()

axes = figure.add_axes([0.2, 0.2, 0.8, 0.8])

axes.plot(x, y, 'b')
axes.set_xlabel('X Axis')
axes.set_ylabel('Y Axis')
axes.set_title('Cube function')

{.img-responsive}

Puede ver que el resultado es similar al que obtuvimos en la última sección, pero esta vez usamos el enfoque orientado a objetos.

Puede agregar tantos ejes como desee en un gráfico usando el método add_axes. Echa un vistazo al siguiente ejemplo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-10, 9, 20)

y = x ** 3

z = x ** 2

figure = plt.figure()

axes = figure.add_axes([0.0, 0.0, 0.9, 0.9])
axes2 = figure.add_axes([0.07, 0.55, 0.35, 0.3]) # inset axes

axes.plot(x, y, 'b')
axes.set_xlabel('X Axis')
axes.set_ylabel('Y Axis')
axes.set_title('Cube function')

axes2.plot(x, z, 'r')
axes2.set_xlabel('X Axis')
axes2.set_ylabel('Y Axis')
axes2.set_title('Square function')

Fíjate bien en el guión de arriba. En el script de arriba tenemos dos ejes. El primer eje contiene gráficos de la raíz cúbica de la entrada, mientras que el segundo eje dibuja el gráfico de la raíz cuadrada de los mismos datos dentro del otro gráfico para el eje del cubo.

En este ejemplo, comprenderá mejor el papel de los parámetros para la izquierda, la parte inferior, el ancho y la altura. En el primer eje, los valores de la izquierda y la parte inferior se establecen en cero, mientras que el valor de la anchura y la altura se establecen en 0,9, lo que significa que nuestro eje exterior tendrá el 90 % de la anchura y la altura del eje predeterminado.

Para el segundo eje, el valor de la izquierda se establece en 0,07, para la parte inferior se establece en 0,55, mientras que el ancho y la altura son 0,35 y 0,3 respectivamente. Si ejecuta el script anterior, verá un gráfico grande para la función del cubo, mientras que un gráfico pequeño para una función cuadrada que se encuentra dentro del gráfico del cubo. La salida se ve así:

{.img-responsive}

Subparcelas

Otra forma de crear más de un gráfico a la vez es usar el método subplot. Debe pasar los valores para los parámetros nrow y ncols. El número total de parcelas generadas será nrow x ncols. Echemos un vistazo a un ejemplo simple. Ejecute el siguiente script:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-10, 9, 20)

y = x ** 3

z = x ** 2

fig, axes = plt.subplots(nrows=2, ncols=3)

En la salida, verá 6 parcelas en 2 filas y 3 columnas como se muestra a continuación:

{.img-responsive}

A continuación, usaremos un ciclo para agregar la salida de la función cuadrada a cada uno de estos gráficos. Echa un vistazo al siguiente script:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-10, 9, 20)

z = x ** 2

figure, axes = plt.subplots(nrows=2, ncols=3)

for rows in axes:
    for ax1 in rows:
        ax1.plot(x, z, 'b')
        ax1.set_xlabel('X - axis')
        ax1.set_ylabel('Y - axis')
        ax1.set_title('Square Function')

En el script anterior, iteramos sobre los ejes devueltos por la función subplots y mostramos la salida de la función cuadrada en cada eje. Recuerde, dado que tenemos ejes en 2 filas y tres columnas, tenemos que ejecutar un ciclo anidado para iterar a través de todos los ejes. El ciclo for externo itera a través de los ejes en filas, mientras que el ciclo for interno itera a través del eje en columnas. El resultado del script anterior se parece a esto:

{.img-responsive}

En la salida, puede ver los seis gráficos con funciones cuadradas.

Cambiar el tamaño de la figura para un gráfico {#cambiar el tamaño de la figura para un gráfico}

Además de cambiar el tamaño predeterminado del gráfico, también puede cambiar el tamaño de la figura para gráficos específicos. Para hacerlo, debe pasar un valor para el parámetro figsize de la función subplots. El valor del parámetro figsize debe pasarse en forma de tupla donde el primer valor corresponde al ancho mientras que el segundo valor corresponde a la altura del gráfico. Mire el siguiente ejemplo para ver cómo cambiar el tamaño de un gráfico específico:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-10, 9, 20)

y = x ** 3

z = x ** 2

figure, axes = plt.subplots(figsize = (6,8))

axes.plot(x, z, 'r')
axes.set_xlabel('X-Axis')
axes.set_ylabel('Y-Axis')
axes.set_title('Square Function')

En el guión anterior, dibuje un gráfico para la función cuadrada que tenga 6 pulgadas de ancho y 8 pulgadas de alto. La salida se ve así:

{.img-responsive}

Adición de leyendas

Agregar leyendas a un gráfico es muy sencillo usando la biblioteca Matplotlib. Todo lo que tienes que hacer es pasar el valor del parámetro etiqueta de la función trazar. Luego, después de llamar a la función plot, solo necesita llamar a la función leyenda. Echa un vistazo al siguiente ejemplo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-10, 9, 20)

y = x ** 3

z = x ** 2

figure = plt.figure()

axes = figure.add_axes([0,0,1,1])

axes.plot(x, z, label="Square Function")
axes.plot(x, y, label="Cube Function")
axes.legend()

En el script anterior, definimos dos funciones: cuadrado y cubo usando las variables x, y y z. A continuación, primero trazamos la función cuadrada y para el parámetro etiqueta, pasamos el valor Función cuadrada. Este será el valor mostrado en la etiqueta para la función cuadrada. A continuación, trazamos la función de cubo y pasamos Cube Function como valor para el parámetro label. La salida se ve así:

{.img-responsive}

En la salida, puede ver una leyenda en la esquina superior izquierda.

La posición de la leyenda se puede cambiar pasando un valor para el parámetro loc de la función leyenda. Los valores posibles pueden ser 1 (para la esquina superior derecha), 2 (para la esquina superior izquierda), 3 (para la esquina inferior izquierda) y 4 (para la esquina inferior derecha). Dibujemos una leyenda en la esquina inferior derecha del gráfico. Ejecute el siguiente script:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-10, 9, 20)

y = x ** 3

z = x ** 2

figure = plt.figure()

axes = figure.add_axes([0,0,1,1])

axes.plot(x, z, label="Square Function")
axes.plot(x, y, label="Cube Function")
axes.legend(loc=4)

Producción:

{.img-responsive}

Opciones de color {#opciones de color}

Hay varias opciones para cambiar el color y los estilos de las tramas. La forma más sencilla es pasar la primera letra del color como tercer argumento, como se muestra en el siguiente script:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-10, 9, 20)

y = x ** 3

z = x ** 2

figure = plt.figure()

axes = figure.add_axes([0,0,1,1])

axes.plot(x, z, "r" ,label="Square Function")
axes.plot(x, y, "g", label="Cube Function")
axes.legend(loc=4)

En el script anterior, se ha pasado una cadena "r" como tercer parámetro para el primer gráfico. Para el segundo gráfico, la cadena "g" se ha pasado en el tercer parámetro. En la salida, el primer gráfico se imprimirá con una línea continua roja, mientras que el segundo gráfico se imprimirá con una línea continua verde, como se muestra a continuación:

{.img-responsive}

Otra forma de cambiar el color de la trama es hacer uso del parámetro color. Puede pasar el nombre del color o el valor hexadecimal del color al parámetro color. Echa un vistazo al siguiente ejemplo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-10, 9, 20)

y = x ** 3

z = x ** 2

figure = plt.figure()

axes = figure.add_axes([0,0,1,1])

axes.plot(x, z, color = "purple" ,label="Square Function")
axes.plot(x, y, color = "#FF0000", label="Cube Function")
axes.legend(loc=4)

Producción:

{.img-responsive}

Diagrama de pila {#plot de pila}

Stack plot es una extensión del gráfico de barras o gráfico de líneas que desglosa los datos de diferentes categorías y los apila para que la comparación entre los valores de diferentes categorías se pueda hacer fácilmente.

Supongamos que desea comparar los goles marcados por tres jugadores de fútbol diferentes por año en el transcurso de los últimos 8 años, puede crear un diagrama de pila usando Matplot usando el siguiente script:

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

year = [2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018]

player1 = [8,10,17,15,23,18,24,29]
player2 = [10,14,19,16,25,20,26,32]
player3 = [12,17,21,19,26,22,28,35]

plt.plot([],[], color='y', label = 'player1')
plt.plot([],[], color='r', label = 'player2')
plt.plot([],[], color='b', label = 'player3 ')

plt.stackplot(year, player1, player2, player3, colors = ['y','r','b'])
plt.legend()
plt.title('Goals by three players')
plt.xlabel('year')
plt.ylabel('Goals')
plt.show()

Producción:

{.img-responsive}

Para crear un diagrama de pila usando Python, simplemente puede usar la clase stackplot de la biblioteca Matplotlib. Los valores que desea mostrar se pasan como primer parámetro a la clase y los valores que se apilarán en el eje horizontal se muestran como segundo parámetro, tercer parámetro y así sucesivamente. También puede establecer el color para cada categoría usando el atributo colors.

Gráfico circular {#gráfico circular}

Un tipo circular es un gráfico circular en el que se marcan diferentes categorías como parte del círculo. Cuanto mayor sea la participación de la categoría, mayor será la porción que ocupará en el gráfico.

Dibujemos un gráfico circular simple de los goles marcados por un equipo de fútbol de tiros libres, penales y tiros de campo. Echa un vistazo al siguiente script:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import matplotlib.pyplot as plt

goal_types = 'Penalties', 'Field Goals', 'Free Kicks'

goals = [12,38,7]
colors = ['y','r','b']

plt.pie(goals, labels = goal_types, colors=colors ,shadow = True, explode = (0.05, 0.05, 0.05), autopct = '%1.1f%%')
plt.axis('equal')

plt.show()

Producción:

{.img-responsive}

Para crear un gráfico circular en Matplot lib, se utiliza la clase pie. El primer parámetro del constructor de clases es la lista de números para cada categoría. La lista de categorías separadas por comas se pasa como argumento al atributo labels. La lista de colores para cada categoría se pasa al atributo colors. Si se establece en verdadero, el atributo sombra crea sombras alrededor de diferentes categorías en el gráfico circular. Finalmente, el atributo explotar divide el gráfico circular en partes individuales.

Es importante mencionar aquí que no tienes que pasar el porcentaje para cada categoría; más bien, solo tiene que pasar los valores y el porcentaje para los gráficos circulares se calculará automáticamente.

Guardar un gráfico

Guardar un gráfico es muy fácil en Matplotlib. Todo lo que tienes que hacer es llamar al método savefig desde el objeto figure y pasarle la ruta del archivo con el que quieres que se guarde tu gráfico. Echa un vistazo al siguiente ejemplo:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import matplotlib.pyplot as plt
import numpy as np
x = np.linspace(-10, 9, 20)

y = x ** 3

z = x ** 2

figure, axes = plt.subplots(figsize = (6,8))

axes.plot(x, z, 'r')
axes.set_xlabel('X-Axis')
axes.set_ylabel('Y-Axis')
axes.set_title('Square Function')

figure.savefig(r'E:/fig1.jpg')

El script anterior guardará su archivo con el nombre fig1.jpg en la raíz del directorio E.

Si te interesa la visualización de datos y no sabes por dónde empezar, asegúrate de consultar nuestro libro sobre [Visualización de datos en Python](https://gumroad.com/l/data-visualization-in -python).

Visualización de datos en Python, un libro para desarrolladores principiantes e intermedios de Python, lo guiará a través de la manipulación de datos simple con Pandas, cubrirá bibliotecas de trazado centrales como Matplotlib y Seaborn, y le mostrará cómo aprovechar bibliotecas declarativas y experimentales como Altair.

Visualización de datos en Python ¡Comprenda mejor sus datos con visualizaciones! Con más de 275 páginas, aprenderá los entresijos de la visualización de datos en Python con bibliotecas populares como Matplotlib, Seaborn, Bokeh y más.

Conclusión

Matplotlib es una de las bibliotecas de Python más utilizadas para la visualización y el trazado de datos. El artículo explica algunas de las funciones de Matplotlib más utilizadas con la ayuda de diferentes ejemplos. Aunque el artículo cubre la mayoría de los aspectos básicos, esto es solo la punta del iceberg. Le sugiero que explore la documentación oficial de la biblioteca matplotlib y vea qué más puede hacer con esta increíble biblioteca. a.

Licensed under CC BY-NC-SA 4.0