web-dev-qa-db-fra.com

Réduit les marges gauche et droite dans le tracé matplotlib

J'ai du mal à gérer les marges de mon complot 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, je reçois un chiffre de sortie avec beaucoup d'espace blanc de chaque côté de l'intrigue. J'ai cherché sur Google et lu la documentation de matplotlib, mais je n'arrive pas à trouver comment réduire cela.

157
robintw

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

Une autre méthode consiste à 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')
_
218
Joe Kington

Vous pouvez ajuster l'espacement autour des figures 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 affichée à l'écran que pour celle enregistrée dans un fichier. C'est la fonction à utiliser même si vous n'avez pas plusieurs tracés sur la même figure.

Les nombres sont des fractions des dimensions de la figure et devront être ajustés pour permettre les étiquettes de la figure.

129
DaveP

Tout ce dont tu as besoin c'est

plt.tight_layout()

avant votre sortie.

En plus de réduire les marges, cela permet également de regrouper étroitement l'espace entre toutes les sous-parcelles:

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()
49
user2065406

Utilisez simplement ax = fig.add_axes([left, bottom, width, height]) si vous voulez contrôler exactement la structure de la figure. par exemple.

left = 0.05
bottom = 0.05
width = 0.9
height = 0.9
ax = fig.add_axes([left, bottom, width, height])
7
mason
plt.savefig("circle.png", bbox_inches='tight',pad_inches=-1)
4
Tian Chu

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 sert à chiffrer correctement l’impression d’un fichier 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" en dimension x et "figure.ysize" en dimension y. Ainsi, la figure entière a une marge gauche de 5 mm, une marge inférieure de 4 mm, une droite de 1 mm et un sommet de 3 mm à l'intérieur des étiquettes. La conversion de (x/25.4) est effectuée car je devais convertir mm en pouces.

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

Autres sniplets (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
Sammy

inspiré par 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=...)

3
michaelosthege

Pour moi, les réponses ci-dessus ne fonctionnaient pas avec matplotlib.__version__ = 1.4.3 sur Win7. Donc, si nous ne nous intéressons qu'à l'image elle-même (c'est-à-dire, si nous n'avons pas besoin d'annotations, d'axe, de ticks, de titre, de label, etc.), il est préférable de simplement sauvegarder le tableau numpy en tant qu'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)

De plus, en utilisant les fonctions de dessin opencv (cv2.line, cv2.polylines), nous pouvons faire des dessins directement sur le tableau numpy. http://docs.opencv.org/2.4/modules/core/doc/drawing_functions.html

2
otterb