217 votes

Réduire les marges gauche et droite dans les tracés de matplotlib

J'ai du mal à gérer les marges de mes tracés dans matplotlib. J'ai utilisé le code ci-dessous pour produire mon graphique :

plt.imshow(g)
c = plt.colorbar()
c.set_label("Number of Slabs")
plt.savefig("OutputToUse.png")

Cependant, j'obtiens une figure de sortie avec beaucoup d'espace blanc de chaque côté du tracé. J'ai cherché sur Google et lu la documentation de matplotlib, mais je n'arrive pas à trouver comment réduire ce problème.

0 votes

Le problème est-il dû à la quantité d'espaces dans le texte ? extent de la imshow ou la quantité d'espace blanc de bordure dans le png résultant, autour de la figure, générée par savefig ?

0 votes

Je pense les deux - il semble y avoir beaucoup d'espace à la fois dans la fenêtre de visualisation et dans le PNG. Cependant, le résultat important est le fichier png produit par savefig - c'est donc ce que j'aimerais trier.

0 votes

Je les ai juste recadrées dans GIMP après coup. :/

305voto

Joe Kington Points 68089

Une façon de le faire automatiquement est le bbox_inches='tight' kwarg à plt.savefig .

Par exemple

import matplotlib.pyplot as plt
import numpy as np
data = np.arange(3000).reshape((100,30))
plt.imshow(data)
plt.savefig('test.png', bbox_inches='tight')

7 votes

Y a-t-il un moyen de faire en sorte que ce soit le cas par défaut ?

1 votes

Si vous avez plusieurs sous-plots et que vous voulez sauvegarder chacun d'entre eux, vous pouvez utiliser ceci avec fig.savefig() aussi. ( plt.savefig() ne fonctionnera pas dans ce cas).

2 votes

Tout ce que cela fait, c'est de recadrer l'image après qu'elle a été rendue ; si vous essayez d'appliquer une résolution particulière, l'image sortira plus petit .

171voto

DaveP Points 2877

Vous pouvez ajuster l'espacement autour des figures de matplotlib en utilisant la fonction subplots_adjust() :

import matplotlib.pyplot as plt
plt.plot(whatever)
plt.subplots_adjust(left=0.1, right=0.9, top=0.9, bottom=0.1)

Cela fonctionnera aussi bien pour la figure à l'écran que pour celle enregistrée dans un fichier, et c'est la bonne fonction à appeler même si vous n'avez pas plusieurs tracés sur la même figure.

Les chiffres sont des fractions des dimensions de la figure, et devront être ajustés pour tenir compte des étiquettes de la figure.

10 votes

Les valeurs attribuées aux paramètres et non pas de combien il faut les modifier, elles sont l'endroit où définir la marge. En d'autres termes, si vous voulez augmenter la marge du bord droit de 10 %, vous devez définir right=0.9, et non right=0.1. matplotlib.sourceforge.net/api/

1 votes

Il est utile de souligner que vous pouvez évidemment spécifier des valeurs négatives dans plt.subplots_adjust(). Cela vous permet même de dessiner en dehors de la zone de la figure et de gérer les marges gênantes.

0 votes

Cela fonctionne également sur GridSpec en appelant la fonction update (voir stackoverflow.com/a/20058199/1030876 ).

65voto

user2065406 Points 131

Tout ce dont vous avez besoin est

plt.tight_layout()

avant votre sortie.

En plus de réduire les marges, cela permet de regrouper étroitement l'espace entre les intrigues secondaires :

x = [1,2,3]
y = [1,4,9]
import matplotlib.pyplot as plt
fig = plt.figure()
subplot1 = fig.add_subplot(121)
subplot1.plot(x,y)
subplot2 = fig.add_subplot(122)
subplot2.plot(y,x)
fig.tight_layout()
plt.show()

8 votes

Je pense que c'est vraiment la meilleure méthode. Elle ne nécessite pas de sauvegarder la figure comme `bbox='tight' et résout toutes sortes d'autres problèmes de mise en page dans les figures exiguës.

2 votes

Cette réponse devrait être la bonne, car elle se comporte comme vous vous y attendez, puisqu'elle s'applique à la FIGURE et non à l'image.

0 votes

Curieusement, cela modifie également la largeur de l'écran de l'utilisateur. parcelle réelle (c'est-à-dire que les pics sont plus rapprochés les uns des autres) par rapport à bbox_inches='tight' qui ne fait qu'effacer l'espace blanc sur les bords mais ne touche pas à l'intrigue. J'ai créé la figure avec plt.figure(figsize=(10,3)) .

5voto

Tian Chu Points 17
plt.savefig("circle.png", bbox_inches='tight',pad_inches=-1)

1 votes

"pad_inches=-1" car mon savefig ne produit qu'une partie de la figure.

0 votes

L'utilisation d'un paramètre dans le savefig est élégante, mais la valeur négative de la fonction pad_inches n'est pas nécessairement nécessaire dans tous les cas.

1 votes

Le mettre à 0, aide

4voto

Sammy Points 31

Le problème avec matplotlibs subplots_adjust est que les valeurs que vous entrez sont relatives aux dimensions x et y de la figure. Cet exemple permet de corriger la taille de la figure pour l'impression d'un pdf :

Pour cela, je recalcule l'espacement relatif en valeurs absolues comme ceci :

pyplot.subplots_adjust(left = (5/25.4)/figure.xsize, bottom = (4/25.4)/figure.ysize, right = 1 - (1/25.4)/figure.xsize, top = 1 - (3/25.4)/figure.ysize)

pour une figure de 'figure.xsize' pouces en dimension x et 'figure.ysize' pouces en dimension y. La figure entière a donc une marge gauche de 5 mm, une marge inférieure de 4 mm, une marge droite de 1 mm et une marge supérieure de 3 mm à l'intérieur des étiquettes. La conversion de (x/25,4) est faite parce que j'avais besoin de convertir les mm en pouces.

Notez que la taille pure du graphique x sera "figure.xsize - marge gauche - marge droite" et la taille pure du graphique y sera "figure.ysize - marge inférieure - marge supérieure" en pouces.

Autres sniplets (je ne suis pas sûr de ceux-là, je voulais juste fournir les autres paramètres)

pyplot.figure(figsize = figureSize, dpi = None)

et

pyplot.savefig("outputname.eps", dpi = 100)

3 votes

Où avez-vous trouvé xsize et ysize de. J'utilise ces propriétés et j'obtiens AttributeError: 'Figure' object has no attribute 'xsize'

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