293 votes

Matplotlib tight_layout() ne prend pas en compte le suptitle de la figure

Si j'ajoute un sous-titre à ma figure matplotlib, il est recouvert par les titres des sous-plots. Quelqu'un sait-il comment s'occuper facilement de cela ? J'ai essayé le tight_layout() 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()

7voto

Herman Schaaf Points 9938

Comme l'ont mentionné d'autres personnes, par défaut, la disposition serrée ne tient pas compte du suptitle. Cependant, j'ai constaté qu'il est possible d'utiliser la fonction bbox_extra_artists argument pour passer dans le suptitle comme une boîte de délimitation qui devrait être prise en compte :

st = fig.suptitle("My Super Title")
plt.savefig("figure.png", bbox_extra_artists=[st], bbox_inches='tight')

Cela oblige le calcul de la disposition serrée à prendre la suptitle en compte, et cela ressemble à ce que l'on peut attendre.

4voto

wooshuwu Points 21

Ce site web propose une solution simple à ce problème, avec un exemple qui a fonctionné pour moi. La ligne de code qui permet de laisser de l'espace pour le titre est la suivante :

plt.tight_layout(rect=[0, 0, 1, 0.95]) 

Voici une image qui prouve que cela a fonctionné pour moi : Image Link

4voto

ukemi Points 3499

A partir de v3.3 tight_layout prend désormais en charge suptitle :

import matplotlib.pyplot as plt

fig, axs = plt.subplots(1, 3)
for i, ax in enumerate(axs):
    ax.plot([1, 2, 3])
    ax.set_title(f'Axes {i}')

fig.suptitle('suptitle')
fig.tight_layout()

enter image description here

3voto

shootingstars Points 774

J'ai eu du mal avec les méthodes de rognage de matplotlib, j'ai donc créé une fonction qui permet de faire cela par l'intermédiaire de bash Appel à ImageMagick 's commande mogrify ce qui fonctionne bien et permet d'éliminer tout espace blanc supplémentaire du bord de la figure. Pour cela, il faut que vous utilisiez UNIX/Linux, que vous utilisiez la fonction bash et ont ImageMagick installé.

Il suffit de lancer un appel à cette fonction après votre savefig() appeler.

def autocrop_img(filename):
    '''Call ImageMagick mogrify from bash to autocrop image'''
    import subprocess
    import os

    cwd, img_name = os.path.split(filename)

    bashcmd = 'mogrify -trim %s' % img_name
    process = subprocess.Popen(bashcmd.split(), stdout=subprocess.PIPE, cwd=cwd)

2voto

markemus Points 296

La seule chose qui a fonctionné pour moi a été de modifier l'appel à suptitle :

fig.suptitle("title", y=.995)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X