Troisième fois le charme. Je suppose que c'est un bogue et la réponse de Zhenya suggère qu'il est corrigé dans la dernière version. J'ai la version 0.99.1.1 et j'ai créé la solution suivante:
import matplotlib.pyplot as plt
import numpy as np
def forceAspect(ax,aspect=1):
im = ax.get_images()
extent = im[0].get_extent()
ax.set_aspect(abs((extent[1]-extent[0])/(extent[3]-extent[2]))/aspect)
data = np.random.rand(10,20)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.imshow(data)
ax.set_xlabel('xlabel')
ax.set_aspect(2)
fig.savefig('equal.png')
ax.set_aspect('auto')
fig.savefig('auto.png')
forceAspect(ax,aspect=1)
fig.savefig('force.png')
C'est 'force.png':
Voici mes tentatives infructueuses, mais j'espère informatives.
Deuxième réponse:
Ma «réponse originale» ci-dessous est exagérée, car elle fait quelque chose de similaire à axes.set_aspect()
. Je pense que vous voulez utiliser axes.set_aspect('auto')
. Je ne comprends pas pourquoi c'est le cas, mais cela produit un tracé d'image carrée pour moi, par exemple ce script:
import matplotlib.pyplot as plt
import numpy as np
data = np.random.rand(10,20)
fig = plt.figure()
ax = fig.add_subplot(111)
ax.imshow(data)
ax.set_aspect('equal')
fig.savefig('equal.png')
ax.set_aspect('auto')
fig.savefig('auto.png')
Produit un tracé d'image avec un rapport hauteur / largeur 'égal':
et un avec un rapport hauteur / largeur 'auto':
Le code fourni ci-dessous dans la «réponse originale» fournit un point de départ pour un rapport hauteur / largeur explicitement contrôlé, mais il semble être ignoré une fois qu'un imshow est appelé.
Réponse originale:
Voici un exemple de routine qui ajustera les paramètres du sous-tracé afin que vous obteniez le rapport hauteur / largeur souhaité:
import matplotlib.pyplot as plt
def adjustFigAspect(fig,aspect=1):
'''
Adjust the subplot parameters so that the figure has the correct
aspect ratio.
'''
xsize,ysize = fig.get_size_inches()
minsize = min(xsize,ysize)
xlim = .4*minsize/xsize
ylim = .4*minsize/ysize
if aspect < 1:
xlim *= aspect
else:
ylim /= aspect
fig.subplots_adjust(left=.5-xlim,
right=.5+xlim,
bottom=.5-ylim,
top=.5+ylim)
fig = plt.figure()
adjustFigAspect(fig,aspect=.5)
ax = fig.add_subplot(111)
ax.plot(range(10),range(10))
fig.savefig('axAspect.png')
Cela produit un chiffre comme celui-ci:
Je peux imaginer que si vous avez plusieurs sous-graphiques dans la figure, vous voudriez inclure le nombre de sous-graphiques y et x en tant que paramètres de mot-clé (par défaut à 1 chacun) à la routine fournie. Ensuite, en utilisant ces nombres et les mots hspace
- wspace
clés et , vous pouvez faire en sorte que tous les sous-graphiques aient le bon rapport hauteur / largeur.
ax.axis('equal')
, par hasard? Comme tout le monde l'a dit, ce que vous avez fait devrait fonctionner, maisax.axis
pourrait être un autre moyen d'essayer une solution de contournement.