Eine Sache, die Sie in Ihrem Code sehr leicht ändern können, ist die, die fontsize
Sie für die Titel verwenden. Ich gehe jedoch davon aus, dass Sie das nicht nur tun wollen!
Einige Alternativen zur Verwendung fig.subplots_adjust(top=0.85)
:
Normalerweise tight_layout()
macht es einen ziemlich guten Job, alles an guten Orten zu positionieren, damit sie sich nicht überlappen. Der Grund, tight_layout()
der in diesem Fall nicht hilft, ist, dass tight_layout()
fig.suptitle () nicht berücksichtigt wird. Auf GitHub gibt es dazu ein offenes Problem: https://github.com/matplotlib/matplotlib/issues/829 [2014 geschlossen, da ein vollständiger Geometriemanager erforderlich ist - verschoben auf https://github.com/matplotlib/matplotlib / Issues / 1109 ].
Wenn Sie den Thread lesen, gibt es eine Lösung für Ihr Problem GridSpec
. Der Schlüssel ist, beim Aufrufen tight_layout
mit dem rect
kwarg etwas Platz oben in der Figur zu lassen. Für Ihr Problem lautet der Code:
Verwenden von 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()
Das Ergebnis:
Vielleicht GridSpec
ist es ein bisschen übertrieben für Sie, oder Ihr eigentliches Problem wird viel mehr Nebenhandlungen auf einer viel größeren Leinwand oder andere Komplikationen beinhalten. Ein einfacher Hack besteht darin, einfach annotate()
die Koordinaten zu verwenden und zu sperren 'figure fraction'
, um a zu imitieren suptitle
. Möglicherweise müssen Sie jedoch einige feinere Anpassungen vornehmen, wenn Sie sich die Ausgabe ansehen. Beachten Sie, dass diese zweite Lösung nicht verwendet wird tight_layout()
.
Einfachere Lösung (muss jedoch möglicherweise verfeinert werden)
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()
Das Ergebnis:
[Verwenden von Python
2.7.3 (64-Bit) und matplotlib
1.2.0]