web-dev-qa-db-fra.com

Redimensionner une figure automatiquement dans matplotlib

Existe-t-il un moyen de redimensionner automatiquement une figure pour ajuster correctement les parcelles contenues dans une image matplotlib/pylab? 

Je crée des (sous-) diagrammes heatmap dont les proportions sont différentes en fonction des données utilisées.

Je me rends compte que je pourrais calculer le rapport de format et le définir manuellement, mais il existe sûrement un moyen plus facile? 

30
pufferfish

Utilisez bbox_inches = 'tight'

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

X = 10*np.random.Rand(5,3)

fig = plt.figure(figsize=(15,5),facecolor='w') 
ax = fig.add_subplot(111)
ax.imshow(X, cmap=cm.jet)

plt.savefig("image.png",bbox_inches='tight',dpi=100)

... ne fonctionne que si vous enregistrez des images, mais ne les affiche pas.

40
pufferfish

utilisez simplement aspect = 'auto' lorsque vous appelez imshow

import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm

X = 10*np.random.Rand(5,3)
plt.imshow(X, aspect='auto')

ça marche même si c'est juste pour montrer et ne pas sauvegarder

Une autre façon de faire consiste à utiliser la fonction tight_layout de matplotlib

import matplotlib.pyplot as plt
fig,(ax) = plt.subplots(figsize=(8,4), ncols=1)
data = [0,1,2,3,4]
ax.plot(data)
fig.tight_layout()
fig.show()
7
Simon Hobbs

Voulez-vous dire changer la taille de l'image ou la zone visible dans une parcelle?

La taille d'une figure peut être définie avec Figure.set_figsize_inches . Le SciPy Cookbook contient également une entrée sur la modification de la taille de l'image qui contient une section sur plusieurs images par figure.

Regardez aussi cette question .

3
wierob

vous pouvez essayer d'utiliser axis ('scaled')

import matplotlib.pyplot as plt
import numpy

#some dummy images
img1 = numpy.array([[.1,.2],[.3,.4]]) 
img2 = numpy.array([[.1,.2],[.3,.4]])

fig,ax = plt.subplots()
ax.imshow(img1,extent=[0,1,0,1])
ax.imshow(img2,extent=[2,3,0,1])
ax.axis('scaled') #this line fits your images to screen 
plt.show()
2
jelde015

Aussi possible d'utiliser ax.autoscale avec un objet ax

ax.autoscale(enable=True) 
0
Shakujin