Solución:
1. ¿Qué significan las coordenadas de las figuras?
Las coordenadas de la figura van de 0 a 1, donde (0,0) es la esquina inferior izquierda y (1,1) es la esquina superior derecha. Una coordenada de y=1.05
está, por tanto, ligeramente fuera de la figura.
2. ¿Cuál es el efecto sobre el tamaño de la figura al especificar y para suptitulo?
Especificando y
a suptitle no tiene ningún efecto en el tamaño de la figura.
3a. ¿Cómo ajusto manualmente el tamaño y el espaciado de la figura para agregar un título de figura por panel y un subtítulo para toda la figura?
Primero, uno no agregaría un salto de línea adicional. Es decir, si desea tener 2 líneas, no use 3 saltos de línea (n
). Luego, se pueden ajustar los parámetros de la subtrama como se desee para dejar espacio para los títulos. P.ej fig.subplots_adjust(top=0.8)
y usa un y <= 1
para que el título esté dentro de la figura.
import matplotlib.pyplot as plt
import numpy as np
data = np.random.random(size=100)
fig, axes = plt.subplots(2, 2, figsize=(10, 5))
fig.subplots_adjust(top=0.8)
axes[0,0].plot(data)
axes[0,0].set_title("n".join(["this is a really long title"]*2))
axes[0,1].plot(data)
axes[1,1].plot(data)
fig.suptitle("n".join(["a big long suptitle that runs into the title"]*2), y=0.98)
plt.show()
3b. … manteniendo el tamaño de cada hacha en la figura?
Mantener el tamaño de los ejes y aún tener suficiente espacio para los títulos solo es posible cambiando el tamaño general de la figura.
Esto podría verse de la siguiente manera, donde definimos una función make_space_above
que toma la matriz de ejes como entrada, así como el margen superior recién deseado en unidades de pulgadas. Entonces, por ejemplo, llega a la conclusión de que necesita 1 pulgada de margen en la parte superior para alojar sus títulos:
import matplotlib.pyplot as plt
import numpy as np
data = np.random.random(size=100)
fig, axes = plt.subplots(2, 2, figsize=(10, 5), squeeze = False)
axes[0,0].plot(data)
axes[0,0].set_title("n".join(["this is a really long title"]*2))
axes[0,1].plot(data)
axes[1,1].plot(data)
fig.suptitle("n".join(["a big long suptitle that runs into the title"]*2), y=0.98)
def make_space_above(axes, topmargin=1):
""" increase figure size to make topmargin (in inches) space for
titles, without changing the axes sizes"""
fig = axes.flatten()[0].figure
s = fig.subplotpars
w, h = fig.get_size_inches()
figh = h - (1-s.top)*h + topmargin
fig.subplots_adjust(bottom=s.bottom*h/figh, top=1-topmargin/figh)
fig.set_figheight(figh)
make_space_above(axes, topmargin=1)
plt.show()
(izquierda: sin llamar make_space_above
; derecha: con llamada a make_space_above(axes, topmargin=1)
)
Respuesta corta
Para aquellos que vienen de Google para ajustar la posición del título en una matriz de dispersión, simplemente puede configurar el y
parámetro a un valor ligeramente inferior a 1:
plt.suptitle('My Title', y=0.92)
… o use restricted_layout:
import matplotlib.pyplot as plt
import numpy as np
data = np.random.random(size=100)
f, a = plt.subplots(2, 2, figsize=(10, 5), constrained_layout=True)
a[0,0].plot(data)
a[0,0].set_title("this is a really long titlen"*2)
a[0,1].plot(data)
a[1,1].plot(data)
plt.suptitle("a big long suptitle that runs into the titlen"*2);