La troisième fois est la bonne. Je suppose qu'il s'agit d'un bug et la réponse de Zhenya suggère que c'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')
Ceci est 'force.png':
Voici mes tentatives infructueuses, mais espérons-le informatives.
Deuxième réponse :
Ma 'réponse originale' ci-dessous est trop complexe, 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é 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 de forme 'égal' : et un avec un rapport 'auto' :
Le code fourni ci-dessous dans la 'réponse originale' fournit un point de départ pour un rapport de forme contrôlé explicitement, mais il semble être ignoré une fois qu'un imshow est appelé.
Réponse originale :
Voici un exemple d'une routine qui ajustera les paramètres du sous-tracé pour que la figure ait le bon rapport de forme :
import matplotlib.pyplot as plt
def adjustFigAspect(fig,aspect=1):
'''
Ajuster les paramètres du sous-tracé pour que la figure ait le bon
rapport de forme.
'''
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 une figure comme suit :
Je peux imaginer si vous avez plusieurs sous-tracés dans la figure, vous voudriez inclure le nombre de sous-tracés y et x en tant que paramètres de mot-clé (par défaut 1 chacun) à la routine fournie. Ensuite, en utilisant ces chiffres et les mots-clés hspace
et wspace
, vous pouvez faire en sorte que tous les sous-tracés aient le bon rapport de forme.
6 votes
Avez-vous essayé
ax.axis('equal')
, par hasard ? Comme tout le monde l'a dit, ce que vous avez fait devrait fonctionner, maisax.axis
pourrait être une autre option à essayer pour contourner le problème.1 votes
matplotlib.org/examples/pylab_examples/equal_aspect_ratio.html