Trzeci razy urok. Domyślam się, że jest to błąd, a odpowiedź Zhenya sugeruje, że został naprawiony w najnowszej wersji. Mam wersję 0.99.1.1 i stworzyłem następujące rozwiązanie:
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')
To jest „force.png”:

Poniżej znajdują się moje nieudane, ale miejmy nadzieję, próby informacyjne.
Druga odpowiedź:
Moja „oryginalna odpowiedź” poniżej jest przesada, ponieważ robi coś podobnego do axes.set_aspect(). Myślę, że chcesz użyć axes.set_aspect('auto'). Nie rozumiem, dlaczego tak jest, ale generuje dla mnie kwadratowy wykres obrazu, na przykład ten skrypt:
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')
Tworzy wykres obrazu o „równych” proporcjach:
i jeden z „automatycznym” współczynnikiem proporcji:

Kod podany poniżej w „oryginalnej odpowiedzi” stanowi punkt wyjścia dla wyraźnie kontrolowanego współczynnika proporcji, ale wydaje się być ignorowany po wywołaniu imshow.
Oryginalna odpowiedź:
Oto przykład procedury, która dostosuje parametry subplotu, aby uzyskać pożądany współczynnik proporcji:
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')
Daje to następującą liczbę:

Mogę sobie wyobrazić, że jeśli masz wiele wykresów podrzędnych na rysunku, chciałbyś uwzględnić liczbę wykresów podrzędnych y i x jako parametry słów kluczowych (domyślnie 1 każdy) do podanej procedury. Następnie używając tych liczb oraz słów kluczowych hspacei wspace, możesz sprawić, że wszystkie działki podrzędne będą miały prawidłowe proporcje.
ax.axis('equal')przez przypadek? Jak wszyscy powiedzieli, to, co zrobiłeś, powinno działać, aleax.axismoże być inną drogą do wypróbowania obejścia.