Introducción a la visualización de datos con Python 7 - Trabajando con objetos de Matplotlib

힘센캥거루
2023년 11월 15일(수정됨)
5
python

En el artículo anterior tratamos un ejercicio práctico de visualización de datos utilizando Pandas y Matplotlib.

En esta ocasión, veremos los subplots de Matplotlib para dibujar varios gráficos a la vez.

1. Subplots

subplots recibe las coordenadas del espacio donde se dibujarán los gráficos y devuelve la figura completa y los ejes de cada gráfico.

fig, axis = plt.subplots(2,2, constrained_layout=True)
axis

Si comprobamos el contenido de axis, podemos ver que cada eje está contenido en una estructura de 2 filas por 2 columnas.

Como todos son objetos, es posible tratarlos por separado.

Introducción a la visualización de datos con Python 7 - Trabajando con objetos de Matplotlib-1

En Jupyter Notebook, el gráfico también se dibuja directamente.

Como todavía no hemos introducido contenido, aparecen 4 gráficos vacíos.

Introducción a la visualización de datos con Python 7 - Trabajando con objetos de Matplotlib-2

Vamos a ir rellenando los gráficos uno por uno. He dibujado gráficos que tienen el mismo valor de x pero diferentes valores de y.

Como la estructura de axis es como en el comentario de abajo, basta con acceder a él como si fuera una coordenada

x = [1,2,3,4,5]
y1 = [1,2,3,4,5]
y2 = [1,3,5,7,9]
y3 = [1,4,9,16,26]
y4 = [1,8,27,64,125]

# Dentro de axis, empezando desde arriba a la izquierda y hacia la derecha
# [[primer, segundo],[tercer, cuarto]] objetos de gráfico están contenidos.
axis[0][0].plot(x,y1)
axis[0][1].plot(x,y2)
axis[1][0].plot(x,y3)
axis[1][1].plot(x,y4)
fig

Si comparas el código anterior con la imagen de abajo, verás cómo se corresponde cada uno. 

Introducción a la visualización de datos con Python 7 - Trabajando con objetos de Matplotlib-3

Podemos acceder a cada objeto gráfico y hacerle modificaciones detalladas.

Basta con añadir set_ delante de las funciones que usábamos antes en plt.

axis[0][0].plot(x,y1, label="y=x")
axis[0][0].set_title("첫번째 그래프")
axis[0][0].set_xlabel("이것은 x축")
axis[0][0].set_ylabel("이것은 y축")
axis[0][0].set_xticks(x)
axis[0][0].set_yticks(y1)
axis[0][0].legend()

Podemos ver que el primer gráfico se ha modificado correctamente como se muestra a continuación.

Introducción a la visualización de datos con Python 7 - Trabajando con objetos de Matplotlib-4

Probemos a modificar los demás gráficos de la misma forma.

No es muy elegante hacerlo con hardcoding, así que vamos a acceder a cada objeto mediante un bucle for doble y modificarlo.

x = [1,2,3,4,5]
y1 = [1,2,3,4,5]
y2 = [1,3,5,7,9]
y3 = [1,4,9,16,26]
y4 = [1,8,27,64,125]

# Creamos una lista que contiene los valores de y y las leyendas
# Usamos nums para ir añadiendo uno tras otro los 4 valores
ys = [y1,y2,y3,y4]
legends = ["y=x", "y=2x-1", "y=x^2", "y=x^3"]
nums = 0

# Recorremos con un doble bucle for (0,0), (0,1), (1,0), (1,1)
for i in range(2):
    for j in range(2):
        # Añadimos el valor de x y el valor en la posición nums dentro de ys
        axis[i][j].plot(x,ys[nums], label=legends[nums])
        axis[i][j].set_title(f"{nums+1}번째 그래프")
        axis[i][j].set_xlabel("이것은 x축")
        axis[i][j].set_ylabel("이것은 y축")
        axis[i][j].set_xticks(x)
        axis[i][j].set_yticks(ys[nums])
        axis[i][j].legend()
        nums += 1
fig

Aunque el eje del último gráfico no convence del todo, todos se han modificado correctamente.

Introducción a la visualización de datos con Python 7 - Trabajando con objetos de Matplotlib-5

2. Ejemplo de uso

Vamos a dibujar con subplots los gráficos del número de delitos ocurridos y el número de detenciones por año que vimos la última vez.

Por supuesto, primero cargamos los valores con pandas.

import pandas as pd

# Llamada a los módulos y configuración de la fuente en coreano
import matplotlib.pyplot as plt
import matplotlib

# Configuración de fuente en MacOS
# matplotlib.rcParams["font.family"] = "AppleGothic"

# Configuración de fuente en Windows
matplotlib.rcParams["font.family"] = "Malgun Gothic"

# Configuración del tamaño de fuente
matplotlib.rcParams["font.size"] = 13

# Solución al problema de visualización del signo menos
plt.rcParams['axes.unicode_minus'] = False

crime = pd.read_excel("./crime_statistics.xlsx")
crime.head(3)
Introducción a la visualización de datos con Python 7 - Trabajando con objetos de Matplotlib-6Introducción a la visualización de datos con Python 7 - Trabajando con objetos de Matplotlib-7

Entre las columnas de los datos, he buscado todas las que contienen la palabra '해킹' (hacking).

Como vamos a hacer un total de 4 gráficos, he reducido la lista para elegir solo 4 columnas.

Después he definido x como los años, y1 como el número de delitos ocurridos y y2 como el número de detenciones dentro de los datos.

cols = [i for i in crime.columns if "해킹" in i]
cols = cols[:4]
x = crime.iloc[:,0].unique()
y1 = crime.loc[crime.구분=="발생건수",cols[0]]
y2 = crime.loc[crime.구분=="검거건수",cols[0]]
Introducción a la visualización de datos con Python 7 - Trabajando con objetos de Matplotlib-8

Con esto he dibujado el primer gráfico.

fig, axis = plt.subplots(2,2, constrained_layout=True)
axis[0][0].plot(x,y1,label="발생건수")
axis[0][0].plot(x,y2,label="검거건수")
axis[0][0].legend()
axis[0][0].set_title(cols[0])
axis[0][0].legend()

El gráfico se ha dibujado correctamente. La posición de la leyenda o el tamaño del texto no son del todo satisfactorios, pero eso es algo que se puede corregir después de dibujar primero.

Ahora convirtamos el código en un doble bucle for para que dibuje todos los gráficos.

Introducción a la visualización de datos con Python 7 - Trabajando con objetos de Matplotlib-9

Metemos todo el código dentro del bucle for y cambiamos las partes que hagan falta.

Primero, hay que cambiar la parte de los ejes a axis[i][j], y hacerlo uno por uno es pesado y poco elegante.

Si usas Alt + Shift + arrastrar con el ratón, se activa el multicursor.

Borra la parte [0][0] y cámbiala por [i][j].

Introducción a la visualización de datos con Python 7 - Trabajando con objetos de Matplotlib-10Introducción a la visualización de datos con Python 7 - Trabajando con objetos de Matplotlib-11

Cuando hayas modificado todo el código, quedará como se muestra abajo.

Si lo ejecutas, dibujará bien todos los gráficos.

fig, axis = plt.subplots(2,2, constrained_layout=True)
col_nums = 0
for i in range(2):
    for j in range(2): 
        y1 = crime.loc[crime.구분=="발생건수",cols[col_nums]]
        y2 = crime.loc[crime.구분=="검거건수",cols[col_nums]]
        axis[i][j].plot(x,y1,label="발생건수")
        axis[i][j].plot(x,y2,"--",label="検거건수")
        axis[i][j].legend()
        axis[i][j].set_title(cols[col_nums])
        axis[i][j].legend()
        col_nums += 1

Si no te convence la leyenda, puedes reducir el tamaño del texto con el parámetro fontsize o cambiar la posición de la leyenda usando bbox_to_achor.

Introducción a la visualización de datos con Python 7 - Trabajando con objetos de Matplotlib-12

Ahora el código está completo. Si quieres comprobar otros datos, solo tienes que cambiar los nombres de las columnas que se guardan en cols.

Esta vez lo he cambiado a '도박' (juego/apuestas).

Y al ejecutar el resto del código, se dibujarán automáticamente los gráficos relacionados con el juego/apuestas.

Introducción a la visualización de datos con Python 7 - Trabajando con objetos de Matplotlib-13Introducción a la visualización de datos con Python 7 - Trabajando con objetos de Matplotlib-14

Ahora vamos a dibujar gráficos sobre delitos financieros cibernéticos

Introducción a la visualización de datos con Python 7 - Trabajando con objetos de Matplotlib-15

Al observar el gráfico, se ve claramente que la naturaleza de los delitos ha cambiado mucho en torno al periodo 2016–2018

Introducción a la visualización de datos con Python 7 - Trabajando con objetos de Matplotlib-16

3. Conclusión

Hoy hemos visto cómo utilizar subplots en matplotlib.

Aquí hemos dibujado gráficos usando únicamente plot, pero además de esto se pueden aplicar muchos otros tipos de gráficos como barras, barras horizontales, gráficos de violín, etc.

La próxima vez, usaremos el módulo numpy para dibujar un gráfico de regresión lineal.

댓글을 불러오는 중...