Matplotlib paso a paso: una figura múltiple
En papers es muy común tener figuras con varias partes. Por ejemplo:
En esta sección me voy a centrar
en cómo crear figuras múltiples usando matplotlib.
Empecemos con el código que genera esta figura:
import numpy as np
import matplotlib.pyplot as pt
pt.figure(figsize=(4,6))
pt.subplot(211)
seps = np.load("./results/resultsA.npy")
labels = [10,20,30,40,50]
for j in range(5):
pt.plot(labels, seps[j,:], 'o', linestyle="-", label="$M_2$={}".format(labels[j]))
pt.ylim(0,1.0)
pt.legend(loc="lower left")
pt.xlabel("Size of hidden layer #1, $M_1$")
pt.ylabel(r"Prediction error, $\sigma_\varepsilon$")
pt.subplot(212)
seps = np.load("./results/resultsB.npy")
labels = [10,20,30,40,50]
for j in range(5):
pt.plot(labels, seps[j,:], 'o', linestyle="-", label="$M_2$={}".format(labels[j]))
pt.ylim(0,1.0)
pt.xlabel("Size of hidden layer #1, $M_1$")
pt.ylabel(r"Prediction error, $\sigma_\varepsilon$")
pt.tight_layout()
pt.figtext(0.03,0.97,"A",fontsize=12)
pt.figtext(0.03,0.48,"B", fontsize=12)
pt.savefig("stdev_error.png", dpi=300)
pt.show()
El comienzo
El código comienza de manera muy parecida al ejemplo anterior:
La diferencia es que ahora la figura mide 4 pulgadas de ancho y 6 de altura, es decir, es el doble de alta para acomodar los dos ejes.Crear múltiples ejes en una figura
La clave para definir múltiples ejes es la línea:
Esta instrucción le dice a matplotlib que queremos generar una figura con múltiples
ejes, y que el siguiente eje es el primer eje de una matriz 2x1, donde 2 representa
el número de filas y 1 el número de columnas. De ahí que el argumento de subplot
sea 211.
Contenido del primer eje
Al igual que en el ejemplo anterior, usamos numpy para copiar los datos de un
fichero en un array bidimensional. La diferencia es que en lugar de usar llamadas
a plot individuales para representar los datos, aquí usamos un bucle for:
for j in range(5):
pt.plot(labels, seps[j,:], 'o', linestyle="-", label="$M_2$={}".format(labels[j]))
La interpretación es la siguiente: para cada j entre 0 y 5, vamos a representar
la fila j de nuestro array bidimensional seps, usando círculos unidos por líneas.
El texto de la leyenda la especifica el argumento:
label una cadena de texto donde para cada j estamos
incluyendo el valor contenido en el elemento j de la lista labels definida en la línea nueve. Para ello hacemos uso del método format, el cual sustituye {} por el valor o valores que pasamos como argumento.
Estas dos líneas representan un ejemplo de cómo integrar aspectos de programación en
la creación de figuras. Hasta ahora, el ejemplo anterior contenía simplemente una
lista de instrucciones. Aquí hacemos uso de dos construcciones de Python, el bucle
for y las herramientas para hacer sustituciones en cadenas de texto, para
simplificarnos la vida y evitar tener que escribir a mano cada una de las gráficas de
los ejes.
Definición del segundo eje
Nos saltamos unas cuantas líneas para llegar a la definición del segundo eje de la figura:
Como mencionamos antes, tenemos una matriz 2x1 y este eje corresponde al elemento 2, que en este caso ocupa la segunda fila.
Contenido del segundo eje
El contenido del segundo eje se define igual que el primero. Simplemente destacar
que estamos reusando el nombre seps para definir los datos contenidos en
un fichero distinto. Redefinir seps no cambia el contenido del eje de arriba.
Ajustar las dimensiones
La función:
se encarga de ajustar las dos figuras al tamaño de la figura. En el caso de figuras múltiples esto es importante para evitar que los ejes y los títulos se pisen los unos a otros o se salgan fuera de los límites de la figura
Añadir los identificadores de los ejes
Finalmente, tenemos que identificar el eje superior como la figura A y el de abajo como la figura B. Esto se hace con los siguientes comandos:
figtext añade un texto en la posición especificada por los dos primeros argumentos.
El primer argumento corresponde a la coordenada horizontal y el segundo a la vertical.
Las dos coordenads están normalizadas entre 0 y 1, de manera que (0,0) corresponde
a la esquina inferior izquierda, y (1,1) a la superior derecha. El argumento fontsize
determina el tamaño de la fuente, en este caso 12 puntos.