使用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
相关产品推荐
相关产品推荐

