Lần thứ ba quyến rũ. Tôi đoán rằng đây là một lỗi và câu trả lời của Zhenya cho thấy nó đã được sửa trong phiên bản mới nhất. Tôi có phiên bản 0.99.1.1 và tôi đã tạo giải pháp sau:
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')
Đây là 'force.png':
Dưới đây là những nỗ lực không thành công, nhưng hy vọng có nhiều thông tin.
Câu trả lời thứ hai:
'Câu trả lời ban đầu' của tôi bên dưới là quá mức cần thiết, vì nó hoạt động tương tự như axes.set_aspect()
. Tôi nghĩ rằng bạn muốn sử dụng axes.set_aspect('auto')
. Tôi không hiểu tại sao lại xảy ra trường hợp này, nhưng nó tạo ra một âm mưu hình ảnh vuông cho tôi, ví dụ như tập lệnh này:
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')
Tạo ra một âm mưu hình ảnh có tỷ lệ khung hình 'bằng nhau':
và một âm mưu có tỷ lệ khung hình
'tự động':
Mã được cung cấp bên dưới trong 'câu trả lời ban đầu' cung cấp điểm khởi đầu cho tỷ lệ khung hình được kiểm soát rõ ràng, nhưng nó dường như bị bỏ qua khi một imshow được gọi.
Câu trả lời gốc:
Dưới đây là một ví dụ về một quy trình sẽ điều chỉnh các thông số của subplot để bạn có được tỷ lệ khung hình mong muốn:
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')
Điều này tạo ra một con số như vậy:
Tôi có thể tưởng tượng nếu bạn có nhiều ô con trong hình, bạn sẽ muốn bao gồm số ô con y và x làm tham số từ khóa (mặc định là 1 ô) cho quy trình được cung cấp. Sau đó, sử dụng những con số đó và hspace
và wspace
từ khóa, bạn có thể làm cho tất cả các ô phụ có tỷ lệ khung hình chính xác.
ax.axis('equal')
, tình cờ? Như mọi người đã nói, những gì bạn đã làm sẽ hiệu quả, nhưngax.axis
có thể là một lộ trình khác để cố gắng tìm cách giải quyết.