Terceira vez o charme. Meu palpite é que isso é um bug e a resposta de Zhenya sugere que ele foi corrigido na versão mais recente. Tenho a versão 0.99.1.1 e criei a seguinte solução:
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')
Este é 'force.png':

Abaixo estão minhas tentativas infrutíferas, mas esperançosamente informativas.
Segunda Resposta:
Minha 'resposta original' abaixo é exagerada, pois faz algo semelhante a axes.set_aspect()
. Eu acho que você quer usar axes.set_aspect('auto')
. Não entendo porque é o caso, mas produz um gráfico de imagem quadrada para mim, por exemplo este 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')
Produz um gráfico de imagem com proporção de aspecto 'igual':
e um com proporção de aspecto 'automático':

O código fornecido abaixo na 'resposta original' fornece um ponto de partida para uma proporção de aspecto explicitamente controlada, mas parece ser ignorado quando um imshow é chamado.
Resposta Original:
Aqui está um exemplo de rotina que ajustará os parâmetros do subplot para que você obtenha a proporção de aspecto desejada:
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')
Isso produz uma figura como esta:

Eu posso imaginar se você tiver vários subplots dentro da figura, você gostaria de incluir o número de yex subplots como parâmetros de palavra-chave (padronizando para 1 cada) para a rotina fornecida. Então, usando esses números e as palavras hspace
- wspace
chave e , você pode fazer com que todos os subtramas tenham a proporção correta.
ax.axis('equal')
, por acaso? Como todos disseram, o que você fez deve funcionar, masax.axis
pode ser outro caminho para tentar uma solução alternativa.