第三次魅力。我的猜测是这是一个错误,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':
以下是我的失败尝试,但希望能提供很多帮助。
第二个答案:
我在下面的“原始答案”过于矫kill过正,因为它的作用类似于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
可能是尝试解决方案的另一条途径。