Réduire les marges à gauche et à droite dans la parcelle matplotlib

j'ai du mal à gérer mes marges à matplotlib. J'ai utilisé le code ci-dessous pour produire ma carte:

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

cependant, je reçois un chiffre de sortie avec beaucoup d'espace blanc de chaque côté de la parcelle. J'ai cherché sur google et lu la documentation de matplotlib, mais je n'arrive pas à trouver comment réduire cela.

130
demandé sur robintw 2010-10-28 14:57:59

8 réponses

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

E. G.

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')

une autre façon est d'utiliser fig.tight_layout()

import matplotlib.pyplot as plt
import numpy as np

xs = np.linspace(0, 1, 20); ys = np.sin(xs)

fig = plt.figure()
axes = fig.add_subplot(1,1,1)
axes.plot(xs, ys)

# This should be called after all axes have been added
fig.tight_layout()
fig.savefig('test.png')
181
répondu Joe Kington 2015-01-19 22:58:56

vous pouvez ajuster l'espacement autour des chiffres 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 à la fois pour la figure à l'écran et sauvegardée dans un fichier, et c'est la bonne fonction à appeler même si vous n'avez pas de tracés multiples sur la seule figure.

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

104
répondu DaveP 2012-02-21 06:31:45

Tous vous avez besoin est

plt.tight_layout()

avant votre sortie.

en plus de réduire les marges, cela permet de grouper étroitement l'espace entre les sous-lots:

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()
40
répondu user2065406 2013-03-29 22:46:53

il suffit d'utiliser "ax = fig.add_axes([à gauche, en bas, largeur, hauteur])" si vous voulez un contrôle précis de la figure de mise en page. par exemple.

    left = 0.05
    bottom = 0.05
    width = 0.9
    height = 0.9
    ax = fig.add_axes([left, bottom, width, height])
6
répondu mason 2016-09-21 16:02:26
plt.savefig("circle.png", bbox_inches='tight',pad_inches=-1)
4
répondu Tian Chu 2011-12-17 05:43:02

le problème avec matplotlibs subplots_adjust est que les valeurs que vous entrez sont relatives à x et y figsize de la figure. Cet exemple est pour la taille correcte pour l'impression d'un pdf:

pour cela, je recalcule l'espacement relatif aux 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 x de dimension et de forme.ysize' pouces y-dimension. Donc toute la figure a une marge gauche de 5 mm, en bas marge de 4 mm, 1 mm et haut de 3 mm dans les étiquettes sont placées. La conversion de (x/25.4) est faite parce que j'avais besoin de convertir mm en pouces.

notez que la taille pure du graphique de x sera "figure.xsize-left margin-right margin" et la taille pure du graphique de y sera "figure.ysize-marge inférieure-marge supérieure "en pouces

autres sniplets (pas sûr de ceux-ci, je voulais juste fournir les autres paramètres)

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

et

pyplot.savefig("outputname.eps", dpi = 100)
3
répondu Sammy 2012-09-27 09:46:16

inspiré de la réponse de Sammys ci-dessus:

margins = {  #     vvv margin in inches
    "left"   :     1.5 / figsize[0],
    "bottom" :     0.8 / figsize[1],
    "right"  : 1 - 0.3 / figsize[0],
    "top"    : 1 - 1   / figsize[1]
}
fig.subplots_adjust(**margins)

où figsize est le tuple que vous avez utilisé dans fig = pyplot.figure(figsize=...)

2
répondu michaelosthege 2017-04-19 17:48:14

pour moi, les réponses ci-dessus ne fonctionnaient pas avec matplotlib.__version__ = 1.4.3 sur Win7. Donc, si nous sommes seulement intéressés par l'image elle-même (i.e., si nous n'avons pas besoin d'annotations, axis, tics, titre, ylabel etc), alors il est préférable de simplement sauvegarder le tableau numpy comme image au lieu de savefig .

from pylab import *

ax = subplot(111)
ax.imshow(some_image_numpyarray)
imsave('test.tif', some_image_numpyarray)

# or, if the image came from tiff or png etc
RGBbuffer = ax.get_images()[0].get_array()
imsave('test.tif', RGBbuffer)

aussi, en utilisant les fonctions de dessin opencv (cv2.ligne, cv2.les polylignes), nous pouvons faire quelques dessins directement sur le tableau numpy. http://docs.opencv.org/2.4/modules/core/doc/drawing_functions.html

1
répondu otterb 2016-01-23 23:13:51