Ketiga kali pesona. Dugaan saya ini adalah bug dan jawaban Zhenya menyarankan itu diperbaiki di versi terbaru. Saya memiliki versi 0.99.1.1 dan saya telah membuat solusi berikut:
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')
Ini adalah 'force.png':

Di bawah ini adalah upaya saya yang gagal, namun semoga informatif.
Jawaban Kedua:
'Jawaban asli' saya di bawah ini berlebihan, karena mirip dengan axes.set_aspect(). Saya pikir Anda ingin menggunakan axes.set_aspect('auto'). Saya tidak mengerti mengapa ini terjadi, tetapi menghasilkan plot gambar persegi untuk saya, misalnya skrip ini:
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')
Menghasilkan plot gambar dengan rasio aspek 'sama':
dan plot dengan rasio aspek
'otomatis':

Kode yang diberikan di bawah ini dalam 'jawaban asli' memberikan titik awal untuk rasio aspek yang dikontrol secara eksplisit, tetapi tampaknya diabaikan begitu imshow dipanggil.
Jawaban Asli:
Berikut adalah contoh rutinitas yang akan menyesuaikan parameter subplot sehingga Anda mendapatkan rasio aspek yang diinginkan:
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')
Ini menghasilkan sosok seperti:

Saya dapat membayangkan jika Anda memiliki beberapa subplot dalam gambar, Anda ingin memasukkan jumlah subplot y dan x sebagai parameter kata kunci (masing-masing default ke 1) ke rutin yang disediakan. Kemudian menggunakan angka-angka dan hspacedan wspacekata kunci, Anda dapat membuat semua subplot memiliki aspek rasio yang benar.
ax.axis('equal'), secara kebetulan? Seperti yang dikatakan semua orang, apa yang Anda lakukan harus berhasil, tetapiax.axismungkin merupakan cara lain untuk mencoba mencari solusi.