You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用GridSpec创建子图:多网格布局仅最后一个生效的原因咨询

问题原因与解决方案

我来给你拆解一下这个问题哈~

为什么只有最后一个网格生效?

当你在同一个Figure里创建多个GridSpec却没有明确指定它们的布局区域时,这些GridSpec默认都会占据整个绘图窗口的空间。后续基于新GridSpec创建的子图会覆盖前面的子图(因为它们在同一个图层位置),所以最终你只能看到最后创建的那个网格的效果,前面的都被盖住了。

怎么实现不同网格的独立hspace/wspace?

核心思路是给每个GridSpec分配Figure中互不重叠的区域,让它们各自占据一块空间,这样就能分别设置hspace(子图垂直间距)和wspace(子图水平间距)了。

示例代码

下面是一个具体的实现,我们把绘图窗口分成上下两个区域,分别设置不同的hspace:

import matplotlib.pyplot as plt
from matplotlib.gridspec import GridSpec

# 创建一个指定大小的绘图窗口
fig = plt.figure(figsize=(8, 7))

# 第一个网格:占据窗口上半部分,设置较小的垂直间距
gs_top = GridSpec(2, 2, figure=fig, hspace=0.1, bottom=0.5)
# 在这个网格里添加子图
ax1 = fig.add_subplot(gs_top[0, 0])
ax2 = fig.add_subplot(gs_top[0, 1])
ax3 = fig.add_subplot(gs_top[1, :])

# 第二个网格:占据窗口下半部分,设置较大的垂直间距
gs_bottom = GridSpec(2, 2, figure=fig, hspace=0.8, top=0.45)
# 在这个网格里添加子图
ax4 = fig.add_subplot(gs_bottom[0, 0])
ax5 = fig.add_subplot(gs_bottom[0, 1])
ax6 = fig.add_subplot(gs_bottom[1, :])

# 给子图添加标题以便区分
ax1.set_title('Top Grid - Subplot 1')
ax2.set_title('Top Grid - Subplot 2')
ax3.set_title('Top Grid - Subplot 3')
ax4.set_title('Bottom Grid - Subplot 1')
ax5.set_title('Bottom Grid - Subplot 2')
ax6.set_title('Bottom Grid - Subplot 3')

plt.show()

关键细节解释

  • 我们通过bottom(控制网格底部位置)和top(控制网格顶部位置)参数,把两个网格分别限制在窗口的上半部分和下半部分,避免重叠。这些参数的取值范围是0到1(对应窗口的底部到顶部)。
  • 每个GridSpec的hspace参数是独立设置的:上面的网格用了0.1的小间距,下面的用了0.8的大间距,运行代码后你能明显看到两者的区别。
  • 如果需要左右分区,只需要调整left和right参数即可,逻辑是一样的。

内容的提问来源于stack exchange,提问作者Liris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:46:57