Похоже, что вы можете достичь желаемого результата гораздо проще, используя savefig
'bbox_inches
аргумент.
plt.savefig("output.pdf", bbox_inches="tight", pad_inches=0)
Это работает, если вам не нужна фигура для чего-либо, кроме ее сохранения.
import matplotlib.pyplot as plt
import numpy as np
# GENERATE DATA
x = np.arange(-2.*np.pi,4.*np.pi,0.01)
sin_arr = [np.sin(x-dx) for dx in np.arange(0.,2.*np.pi,0.5)]
# SET FIGURE SIZE AND RCPARAMETERS
plt.rcParams.update( {'figure.figsize' : [5.90551197, 3.64980712]} )
fig, ax = plt.subplots()
for i,sin in enumerate(sin_arr):
ax.plot(x,sin,label=r'$\sin(x)$ '+str(i))
ax.set_xlabel(r'$\varepsilon$')
ax.set_ylabel(r'$\sigma$ in [MPa]', labelpad=15)
ax.set_xlim([0.,2.*np.pi])
# SHRINK PADDING
fig.tight_layout(pad=0)
# ADD LEGEND ON TOP OF AXES WITHOUT CHANGING AXES SIZE
legend = ax.legend( bbox_to_anchor=(0., 1.02, 1., .102),
loc='lower left',
ncol=3,
borderaxespad=0.,mode="expand" )
plt.savefig("output.pdf", bbox_inches="tight", pad_inches=0)
Обратите внимание, что если вы используете plt.tight_layout
, результирующий размер осей может по-прежнему отличаться, если вы используете разные x- или y-метки (например, если они иногда содержат заглавные буквы или буквы, которые идут ниже базовой линии, например, "p" или "г"). В таком случае было бы лучше выбрать некоторые параметры вручную и заменить tight_layout
на
fig.subplots_adjust(left=0.151, bottom=0.130, right=0.994, top=0.990)
или другие параметры, которые вам подходят, с учетом используемых шрифтов.
Следовательно, проблему постоянного размера осей довольно легко решить. Что будет сложнее, так это обратное. Имея постоянный размер фигуры, но сжимая оси таким образом, чтобы фигура все еще соответствовала легенде. Это будет показано в этом вопросе Создание фигуры с точным размером и без отступов (и условных обозначений вне осей)