在Python中调整matplotlib中单个子图的高度

16 投票
2 回答
37178 浏览
提问于 2025-04-16 01:49

如果我有一系列的子图,只有一列但有很多行,比如:

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_ncol_n的最大值分别是m-1n-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。这个工具非常好用,能让你更灵活地安排子图的布局。

撰写回答