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 hspace
dan wspace
kata 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.axis
mungkin merupakan cara lain untuk mencoba mencari solusi.