ครั้งที่สามของเสน่ห์ ฉันเดาว่านี่เป็นข้อบกพร่องและคำตอบของ Zhenyaแนะนำว่าได้รับการแก้ไขแล้วในเวอร์ชันล่าสุด ฉันมีเวอร์ชัน 0.99.1.1 และฉันได้สร้างโซลูชันต่อไปนี้:
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')
นี่คือ 'force.png':

ด้านล่างนี้เป็นความพยายามที่ไม่ประสบความสำเร็จ แต่หวังว่าจะเป็นประโยชน์
คำตอบที่สอง:
ของฉัน 'คำตอบเดิม' ด้านล่างเป็น overkill axes.set_aspect()
ขณะที่มันไม่สิ่งที่คล้ายกับ ฉันคิดว่าคุณต้องการใช้axes.set_aspect('auto')
. ฉันไม่เข้าใจว่าทำไมถึงเป็นเช่นนี้ แต่มันสร้างพล็อตภาพสี่เหลี่ยมสำหรับฉันตัวอย่างเช่นสคริปต์นี้:
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')
สร้างพล็อตภาพที่มีอัตราส่วนภาพ "เท่ากัน"
และอีกภาพหนึ่งที่มีอัตราส่วนภาพ "อัตโนมัติ":

รหัสที่ให้ไว้ด้านล่างใน 'คำตอบเดิม' เป็นจุดเริ่มต้นสำหรับอัตราส่วนภาพที่ควบคุมอย่างชัดเจน แต่ดูเหมือนว่าจะถูกละเว้นเมื่อมีการเรียกใช้ imshow
คำตอบเดิม:
นี่คือตัวอย่างของกิจวัตรที่จะปรับพารามิเตอร์แผนภาพย่อยเพื่อให้คุณได้อัตราส่วนภาพที่ต้องการ:
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')
สิ่งนี้ก่อให้เกิดรูปร่างดังนี้:

ฉันสามารถจินตนาการได้ว่าหากคุณมีพล็อตย่อยหลายจุดภายในรูปคุณจะต้องรวมจำนวนพล็อตย่อย y และ x เป็นพารามิเตอร์คำหลัก (โดยค่าเริ่มต้นเป็น 1 จุด) ในรูทีนที่ให้ไว้ จากนั้นใช้ตัวเลขเหล่านั้นและhspace
และwspace
คำหลักคุณสามารถทำให้พล็อตย่อยทั้งหมดมีอัตราส่วนภาพที่ถูกต้อง
ax.axis('equal')
โดยบังเอิญ? ดังที่ทุกคนกล่าวไว้สิ่งที่คุณทำควรได้ผล แต่ax.axis
อาจเป็นอีกเส้นทางหนึ่งที่จะลองหาวิธีแก้ปัญหา