Jedną rzeczą, którą możesz bardzo łatwo zmienić w kodzie, jest to, fontsizektórego używasz do tytułów. Zakładam jednak, że nie tylko chcesz to zrobić!
Niektóre alternatywy dla używania fig.subplots_adjust(top=0.85):
Zwykle tight_layout()wykonuje dobrą robotę, umieszczając wszystko w dobrych lokalizacjach, aby się nie nakładały. Przyczyna tight_layout()nie pomaga w tym przypadku, ponieważ tight_layout()nie uwzględnia fig.suptitle (). W GitHub istnieje otwarty problem: https://github.com/matplotlib/matplotlib/issues/829 [zamknięty w 2014 r. Ze względu na wymaganie pełnego menedżera geometrii - przeniesiony do https://github.com/matplotlib/matplotlib / Issues / 1109 ].
Jeśli czytasz wątek, możesz rozwiązać problem GridSpec. Kluczem jest pozostawienie miejsca na górze figury podczas dzwonienia tight_layoutza pomocą rectkwarg. W przypadku Twojego problemu kod staje się:
Korzystanie z GridSpec
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
f = np.random.random(100)
g = np.random.random(100)
fig = plt.figure(1)
gs1 = gridspec.GridSpec(1, 2)
ax_list = [fig.add_subplot(ss) for ss in gs1]
ax_list[0].plot(f)
ax_list[0].set_title('Very Long Title 1', fontsize=20)
ax_list[1].plot(g)
ax_list[1].set_title('Very Long Title 2', fontsize=20)
fig.suptitle('Long Suptitle', fontsize=24)
gs1.tight_layout(fig, rect=[0, 0.03, 1, 0.95])
plt.show()
Wynik:

Może GridSpecto dla ciebie trochę przesada, albo twój prawdziwy problem będzie wiązał się z wieloma dodatkowymi wątkami na znacznie większym obszarze roboczym lub innymi komplikacjami. Prostym hakiem jest po prostu użycie annotate()i zablokowanie współrzędnych 'figure fraction'do naśladowania suptitle. Być może jednak będziesz musiał dokonać drobniejszych korekt, gdy spojrzysz na wynik. Zauważ, że to drugie rozwiązanie ma nie wykorzystaniatight_layout() .
Prostsze rozwiązanie (choć może wymagać dopracowania)
fig = plt.figure(2)
ax1 = plt.subplot(121)
ax1.plot(f)
ax1.set_title('Very Long Title 1', fontsize=20)
ax2 = plt.subplot(122)
ax2.plot(g)
ax2.set_title('Very Long Title 2', fontsize=20)
# fig.suptitle('Long Suptitle', fontsize=24)
# Instead, do a hack by annotating the first axes with the desired
# string and set the positioning to 'figure fraction'.
fig.get_axes()[0].annotate('Long Suptitle', (0.5, 0.95),
xycoords='figure fraction', ha='center',
fontsize=24
)
plt.show()
Wynik:

[Korzystanie z wersji Python2.7.3 (64-bitowej) i matplotlib1.2.0]