1. Что означают координаты фигуры?
Координаты рисунка идут от 0 до 1, где (0,0) - левый нижний угол и (1,1) - верхний правый угол. Следовательно, координата y=1.05
немного выходит за пределы фигуры.

2. Как влияет размер фигуры при указании y для субтитра?
Указание y
для субтитров никак не влияет на размер фигуры.
3a. Как вручную настроить размер и интервал между фигурами, чтобы добавить заголовок фигуры для каждой панели и субтитр для всей фигуры?
Во-первых, никто не добавил бы дополнительный перенос строки. То есть если вы хотите иметь 2 строки, не используйте 3 перевода строки (\n
). Затем можно настроить параметры подзаговора по своему усмотрению, чтобы оставить место для заголовков. Например. fig.subplots_adjust(top=0.8)
и используйте y <= 1
, чтобы заголовок находился внутри рисунка.
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. ... сохраняя размер каждого топора на рисунке?
Сохранение размера осей и все еще достаточно места для заголовков возможно только путем изменения общего размера рисунка.
Это может выглядеть следующим образом, где мы определяем функцию make_space_above
, которая принимает массив осей в качестве входных данных, а также новый требуемый верхний предел в единицах дюймов. Так, например, вы пришли к выводу, что вам нужно 1 дюйм поля сверху для размещения ваших заголовков:
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()

(слева: без вызова make_space_above
; справа: с вызовом make_space_above(axes, topmargin=1)
)