我正在尝试制作一个方形图(使用imshow),即纵横比为1:1,但我不能。这些都不起作用:
import matplotlib.pyplot as plt
ax = fig.add_subplot(111,aspect='equal')
ax = fig.add_subplot(111,aspect=1.0)
ax.set_aspect('equal')
plt.axes().set_aspect('equal')
似乎这些调用被忽略了(我经常在matplotlib中遇到这个问题)。
答案 0 :(得分:65)
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':
以下是我的失败,但希望提供信息的尝试。
第二个答案:
下面的“原始回答”是过度的,因为它与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
关键字,您可以使所有子图具有正确的宽高比。
答案 1 :(得分:19)
您运行的matplotlib
版本是什么?我最近不得不升级到1.1.0
,有了它,add_subplot(111,aspect='equal')
对我有用。
答案 2 :(得分:3)
你应该尝试使用figaspect。这个对我有用。来自文档:
创建具有指定宽高比的图形。如果 arg 是一个数字,请使用该宽高比。 &GT;如果 arg 是一个数组,则figaspect将会 确定适合数组的图形的宽度和高度 保持纵横比。图形宽度,高度以英寸为单位 回。确保创建一个等于和高度的轴,例如
使用示例:
# make a figure twice as tall as it is wide
w, h = figaspect(2.)
fig = Figure(figsize=(w,h))
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
ax.imshow(A, **kwargs)
# make a figure with the proper aspect for an array
A = rand(5,3)
w, h = figaspect(A)
fig = Figure(figsize=(w,h))
ax = fig.add_axes([0.1, 0.1, 0.8, 0.8])
ax.imshow(A, **kwargs)
编辑:我不确定你在寻找什么。上面的代码更改了画布(绘图大小)。如果要更改matplotlib窗口的大小,请使用:
In [68]: f = figure(figsize=(5,1))
这会产生一个5x1(wxh)的窗口。
答案 3 :(得分:2)
这个答案是基于Yann的答案。它将为线性或对数 - 对数图设置纵横比。我已使用https://stackoverflow.com/a/16290035/2966723中的其他信息来测试轴是否为对数刻度。
def forceAspect(ax,aspect=1):
#aspect is width/height
scale_str = ax.get_yaxis().get_scale()
xmin,xmax = ax.get_xlim()
ymin,ymax = ax.get_ylim()
if scale_str=='linear':
asp = abs((xmax-xmin)/(ymax-ymin))/aspect
elif scale_str=='log':
asp = abs((scipy.log(xmax)-scipy.log(xmin))/(scipy.log(ymax)-scipy.log(ymin)))/aspect
ax.set_aspect(asp)
显然,你可以使用任何你想要的log
版本,我已经使用过scipy
,但numpy
或math
应该没问题。
答案 4 :(得分:0)
经过以上答案的多年成功之后,我发现它不再起作用-但我确实在以下位置找到了适用于子图的可行解决方案
https://jdhao.github.io/2017/06/03/change-aspect-ratio-in-mpl
当然要感谢以上作者(也许可以在这里发帖),相关内容如下:
ratio = 1.0
xleft, xright = ax.get_xlim()
ybottom, ytop = ax.get_ylim()
ax.set_aspect(abs((xright-xleft)/(ybottom-ytop))*ratio)
该链接还清晰地说明了matplotlib使用的不同坐标系。
感谢收到的所有出色答案-尤其是@Yann的答案,将仍然是赢家。
答案 5 :(得分:0)
使用plt.gca()获取当前轴并设置纵横比的简单选项
plt.gca().set_aspect('equal')
代替最后一行