Si j'ajoute un sous-titre à ma figure matplotlib, il est superposé par les titres du sous-intrigue. Quelqu'un sait-il comment s'en occuper facilement? J'ai essayé la tight_layout()
fonction, mais cela ne fait qu'empirer les choses.
Exemple:
import numpy as np
import matplotlib.pyplot as plt
f = np.random.random(100)
g = np.random.random(100)
fig = plt.figure()
fig.suptitle('Long Suptitle', fontsize=24)
plt.subplot(121)
plt.plot(f)
plt.title('Very Long Title 1', fontsize=20)
plt.subplot(122)
plt.plot(g)
plt.title('Very Long Title 2', fontsize=20)
plt.tight_layout()
plt.show()
python
matplotlib
katrasnikj
la source
la source
tight_layout
documents:[left, bottom, right, top] in normalized (0, 1) figure coordinates
tight_layout(rect=[0, 0.03, 1, 0.9])
au lieu de0.95
celle indiquée dans la réponse.Vous pouvez ajuster manuellement l'espacement en utilisant
plt.subplots_adjust(top=0.85)
:la source
subplots_adjust
subplots_adjust
doit être appelé après tout appel àtight_layout
, sinon l'appel n'aura aucun effetsubplots_adjust
.Une chose que vous pourriez changer très facilement dans votre code est celle que
fontsize
vous utilisez pour les titres. Cependant, je vais supposer que vous ne voulez pas simplement faire ça!Quelques alternatives à l'utilisation
fig.subplots_adjust(top=0.85)
:Fait généralement
tight_layout()
un assez bon travail pour tout placer dans de bons endroits afin qu'ils ne se chevauchent pas. La raisontight_layout()
n'aide pas dans ce cas parcetight_layout()
que 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 de la nécessité d'un gestionnaire de géométrie complet - déplacé vers https://github.com/matplotlib/matplotlib / issues / 1109 ].Si vous lisez le fil, il existe une solution à votre problème impliquant
GridSpec
. La clé est de laisser un espace en haut de la figure lors de l'appeltight_layout
, en utilisant lerect
kwarg. Pour votre problème, le code devient:Utilisation de GridSpec
Le résultat:
C'est peut
GridSpec
- être un peu exagéré pour vous, ou votre vrai problème impliquera beaucoup plus de sous-intrigues sur une toile beaucoup plus grande, ou d'autres complications. Un hack simple consiste à simplement utiliserannotate()
et verrouiller les coordonnées'figure fraction'
pour imiter asuptitle
. Cependant, vous devrez peut-être effectuer des ajustements plus fins une fois que vous aurez examiné la sortie. Notez que cette deuxième solution ne pas utilisertight_layout()
.Solution plus simple (mais peut-être besoin d'être affinée)
Le résultat:
[Utilisation de
Python
2.7.3 (64 bits) etmatplotlib
1.2.0]la source
GridSpec
), comment puis-je créer des sous-parcelles qui partagent des axes? J'utilise habituellementplt.subplots(N,1, sharex=<>, sharey=<>)
lors de la création de sous-intrigues, mais le code que vous avez publié utilise à laadd_subplot
placefig.tight_layout(rect=[0, 0.03, 1, 0.95])
fonctionne également.Une solution alternative et simple à utiliser consiste à ajuster les coordonnées du texte de sous-titre dans la figure en utilisant l'argument y dans l'appel de sous-titre (voir la documentation ):
la source
Une disposition serrée ne fonctionne pas avec les sous-titres, mais le
constrained_layout
fait. Voir cette question Améliorer la taille / l'espacement des sous-parcelles avec de nombreuses sous-parcelles dans matplotlibJ'ai trouvé que l'ajout des sous-parcelles était à la fois mieux,
Mais il peut également être ajouté au moment où la figure est créée:
Remarque: Pour rapprocher mes sous-parcelles, j'utilisais également
et constrained_layout ne fonctionne pas avec ceci :(
la source
J'ai eu du mal avec les méthodes de découpage matplotlib, donc je viens de créer une fonction pour le faire via un
bash
appel àImageMagick
la commande mogrify , qui fonctionne bien et obtient tout l'espace blanc supplémentaire du bord de la figure. Cela nécessite que vous utilisiez UNIX / Linux, que vous utilisiez lebash
shell et que vous l'ayezImageMagick
installé.Appelez simplement cela après votre
savefig()
appel.la source
Comme mentionné par d'autres, par défaut, la mise en page serrée ne prend pas en compte les sous-titres. Cependant, j'ai trouvé qu'il est possible d'utiliser l'
bbox_extra_artists
argument pour passer le sous-titre comme une boîte englobante qui devrait être prise en compte:Cela force le calcul de mise en page serré à prendre
suptitle
en compte, et il ressemble à ce que vous attendez.la source
La seule chose qui a fonctionné pour moi a été de modifier l'appel au sous-titre:
la source
J'ai eu un problème similaire qui s'est produit lors de l'utilisation
tight_layout
pour une très grande grille de tracés (plus de 200 sous-tracés) et le rendu dans un cahier jupyter. J'ai fait une solution rapide qui place toujours votresuptitle
à une certaine distance au-dessus de votre sous-intrigue supérieure:Pour les sous-tracés de taille variable, vous pouvez toujours utiliser cette méthode pour obtenir le haut du sous-tracé le plus haut, puis définir manuellement un montant supplémentaire à ajouter au sous-titre.
la source