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

En Jupyter Notebook, el gráfico también se dibuja directamente.
Como todavía no hemos introducido contenido, aparecen 4 gráficos vacíos.

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)
figSi comparas el código anterior con la imagen de abajo, verás cómo se corresponde cada uno.

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.

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
figAunque el eje del último gráfico no convence del todo, todos se han modificado correctamente.

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)

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

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


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 += 1Si 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.

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.


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

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

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.
댓글을 불러오는 중...