matplotlib - 固定纵横比的子图
我遇到了一个关于绘制多个子图的问题。我想把子图的实际宽高比设置成固定的值。
在我的例子中,我有12个子图(4行3列),放在一个横向的A4纸上。所有的子图都很好地分布在整个图形上,而且每个子图的高度几乎和宽度相等。
但是如果我把图形的布局改成竖向,子图就会被拉伸得很高。
这正是我不想要的。我希望子图的高度和宽度和横向图形上一样。有没有办法让子图的宽高比保持不变呢?
谢谢,
彼得
编辑:
我找到了一种变通的方法。但这只适用于非对数坐标轴...
aspectratio=1.0
ratio_default=(ax.get_xlim()[1]-ax.get_xlim()[0])/(ax.get_ylim()[1]-ax.get_ylim()[0])
ax.set_aspect(ratio_default*aspectratio)
4 个回答
4
针对原问题编辑中提到的解决方案在对数图上不工作的评论,你需要进行如下调整:
def fixed_aspect_ratio_loglog(ratio):
'''
Set a fixed aspect ratio on matplotlib loglog plots
regardless of axis units
'''
xvals,yvals = gca().axes.get_xlim(),gca().axes.get_ylim()
xrange = log(xvals[1])-log(xvals[0])
yrange = log(yvals[1])-log(yvals[0])
gca().set_aspect(ratio*(xrange/yrange), adjustable='box')
(对半对数图的调整现在应该很明显了)
7
你的解决办法对我有效。在绘制完数据后,我调用了下面这个函数:
def fixed_aspect_ratio(ratio):
'''
Set a fixed aspect ratio on matplotlib plots
regardless of axis units
'''
xvals,yvals = gca().axes.get_xlim(),gca().axes.get_ylim()
xrange = xvals[1]-xvals[0]
yrange = yvals[1]-yvals[0]
gca().set_aspect(ratio*(xrange/yrange), adjustable='box')
22
其实,你想要的事情很简单……你只需要确保在你的坐标轴上把 adjustable
设置为 'box'
,并且给坐标轴设置一个固定的长宽比(只要不是 'auto'
就可以)。
你可以在创建子图的时候通过 adjustable
这个参数来做到这一点。或者,你也可以在创建之后,通过调用 ax.set_adjustable('box')
来设置,或者通过调用 ax.set_aspect(aspect, adjustable='box')
来设置(其中 aspect 可以是 'equal'
或者一个数字)。
这样一来,无论图形怎么调整大小,子图都会保持相同的长宽比。
举个例子:
import matplotlib.pyplot as plt
fig = plt.figure()
ax1 = fig.add_subplot(2,1,1, adjustable='box', aspect=0.3)
ax2 = fig.add_subplot(2,1,2)
ax1.plot(range(10))
ax2.plot(range(10))
plt.show()
现在,比较一下上面的子图和下面的子图在调整大小时的表现:
初始图:

调整为垂直布局:

调整为水平布局:
