Высота легенды определяется во время розыгрыша.Вы можете получить его, нарисовав фигуру через legend.get_window_extent()
.Результирующая ограничивающая рамка в единицах пикселей.Чтобы найти смещение заголовка, вам необходимо вычесть верхнюю границу легенды из верхней границы осей.Таким образом, вам необходимо получить положение осей в пикселях.
Заголовок может быть смещен либо в координатах рисунка (y=1.1
), либо в точках (pad=20
).Я бы предложил использовать точки здесь, чтобы они не зависели от размера осей.Таким образом, вы можете вычислить разницу в верхних позициях, преобразовать пиксели в точки (то есть distance [pixels] * ppi / dpi
) и добавить некоторое постоянное смещение в точках (поскольку обычно вы не хотите, чтобы заголовок располагался точно на границе легенды).Затем используйте это число как pad
.
import numpy as np
import matplotlib.pyplot as plt
fig, ax = plt.subplots(constrained_layout=True)
ax.plot([1,2,3], np.random.rand(3,5), label='Label')
leg = ax.legend(loc="lower center", ncol=3, bbox_to_anchor=(.0, 1.02, 1., 1.02),
borderaxespad=0, mode='expand')
fig.canvas.draw()
leg_box = leg.get_window_extent()
ax_box = ax.get_position().transformed(fig.transFigure)
pad = (leg_box.y1 - ax_box.y1)*72./fig.dpi + 6
ax.set_title('SIMPLE PLOT', pad=pad)
plt.show()

Обратите внимание, что здесь я также использовал constrained_layout
, чтобы заголовок не был обрезанГраницы фигуры.