Terza volta il fascino. La mia ipotesi è che si tratti di un bug e la risposta di Zhenya suggerisce che è stato risolto nell'ultima versione. Ho la versione 0.99.1.1 e ho creato la seguente soluzione:
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')
Questo è "force.png":

Di seguito sono riportati i miei tentativi infruttuosi, ma si spera informativi.
Seconda risposta:
La mia "risposta originale" di seguito è eccessiva, in quanto fa qualcosa di simile a axes.set_aspect(). Penso che tu voglia usare axes.set_aspect('auto'). Non capisco perché questo sia il caso, ma produce una trama dell'immagine quadrata per me, ad esempio questo 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')
Produce una trama dell'immagine con proporzioni "uguali":
e una con proporzioni "automatiche":

Il codice fornito di seguito nella "risposta originale" fornisce un punto di partenza per un rapporto di aspetto controllato in modo esplicito, ma sembra essere ignorato una volta chiamato un imshow.
Risposta originale:
Ecco un esempio di una routine che regolerà i parametri della sottotrama in modo da ottenere le proporzioni desiderate:
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')
Questo produce una figura come questa:

Posso immaginare che se hai più sottotrame all'interno della figura, dovresti includere il numero di sottotrame y e x come parametri delle parole chiave (predefinito a 1 ciascuno) nella routine fornita. Quindi utilizzando quei numeri e le parole chiave hspacee wspace, puoi fare in modo che tutte le sottotrame abbiano le proporzioni corrette.
ax.axis('equal'), per caso? Come tutti hanno detto, quello che hai fatto dovrebbe funzionare, maax.axispotrebbe essere un altro modo per provare una soluzione alternativa.