Une chose que vous pourriez changer dans votre code très facilement est la fonction fontsize
que vous utilisez pour les titres. Cependant, je vais supposer que vous ne voulez pas seulement faire cela !
Quelques alternatives à l'utilisation de fig.subplots_adjust(top=0.85)
:
Habituellement tight_layout()
fait un bon travail en plaçant tout au bon endroit pour qu'il n'y ait pas de chevauchement. La raison tight_layout()
n'aide pas dans ce cas, c'est parce que tight_layout()
ne prend pas en compte fig.suptitle(). Il existe un problème ouvert à ce sujet sur GitHub : https://github.com/matplotlib/matplotlib/issues/829 [fermé en 2014 en raison du besoin d'un gestionnaire de la géométrie complète - transféré vers https://github.com/matplotlib/matplotlib/issues/1109 ].
Si vous lisez le fil de discussion, il y a une solution à votre problème impliquant GridSpec
. La clé est de laisser un peu d'espace en haut de la figure lors de l'appel. tight_layout
en utilisant le rect
kwarg. Pour votre problème, le code devient :
Utilisation de 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()
Le résultat :
Quizás GridSpec
est un peu exagéré pour vous, ou votre problème réel implique beaucoup plus d'intrigues secondaires sur une toile beaucoup plus grande, ou d'autres complications. Une astuce simple consiste à utiliser annotate()
et verrouiller les coordonnées à la 'figure fraction'
pour imiter un suptitle
. Vous devrez peut-être procéder à des ajustements plus fins une fois que vous aurez examiné le résultat. Notez que cette deuxième solution ne no utiliser tight_layout()
.
Une solution plus simple (bien qu'il puisse être nécessaire de l'affiner)
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()
Le résultat :
[Utilisation Python
2.7.3 (64 bits) et matplotlib
1.2.0]