在Python中调整matplotlib中单个子图的高度
如果我有一系列的子图,只有一列但有很多行,比如:
plt.subplot(4, 1, 1) # first subplot
plt.subplot(4, 1, 2) # second subplot
# ...
我该怎么调整前N个子图的高度呢?举个例子,如果我有4个子图,每个子图都在自己的一行上,我希望它们的宽度都一样,但前面3个子图要短一些,也就是说它们的y轴要小一些,占用的空间比最后一个子图要少。我该怎么做到这一点呢?
谢谢。
2 个回答
24
虽然这个问题已经有点时间了,但我想回答一个非常相似的问题。@Joe提到的AxesGrid正好解决了我的疑问,而且用法非常简单,所以我想把这个功能展示一下,以便更完整。
AxesGrid的功能可以让我们创建不同大小的图,并且可以非常精确地放置它们,这个功能是通过subplot2grid
来实现的:
import matplotlib.pyplot as plt
ax1 = plt.subplot2grid((m, n), (row_1, col_1), colspan = width)
ax2 = plt.subplot2grid((m, n), (row_2, col_2), rowspan = height)
ax1.plot(...)
ax2.plot(...)
需要注意的是,row_n
和col_n
的最大值分别是m-1
和n-1
,因为这里使用的是从零开始的索引。
具体来说,如果我们有5个子图,而最后一个子图的高度是其他子图的两倍,我们可以设置m=6
。
ax1 = plt.subplot2grid((6, 1), (0, 0))
ax2 = plt.subplot2grid((6, 1), (1, 0))
ax3 = plt.subplot2grid((6, 1), (2, 0))
ax4 = plt.subplot2grid((6, 1), (3, 0))
ax5 = plt.subplot2grid((6, 1), (4, 0), rowspan=2)
plt.show()
4
有很多种方法可以做到这一点。最简单(也是最不灵活)的方法就是直接调用类似下面的代码:
import matplotlib.pyplot as plt
plt.subplot(6,1,1)
plt.subplot(6,1,2)
plt.subplot(6,1,3)
plt.subplot(2,1,2)
这样你会得到像这样的结果:

不过,这种方法灵活性不高。如果你使用的是 matplotlib 版本大于等于 1.0.0,可以考虑使用 GridSpec。这个工具非常好用,能让你更灵活地安排子图的布局。