Saltar a contenido

Matplotlib paso a paso: una figura múltiple

En papers es muy común tener figuras con varias partes. Por ejemplo:

Ejemplo 2
Ejemplo 2: figura creada en matplotlib

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:

import numpy as np
import matplotlib.pyplot as pt

pt.figure(figsize=(4,6))
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:

pt.subplot(211)

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="$M_2$={}".format(labels[j])
En este argumento asignamos a 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:

pt.subplot(212)

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:

pt.tight_layout()

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:

pt.figtext(0.03,0.97,"A",fontsize=12)
pt.figtext(0.03,0.48,"B", fontsize=12)

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.