如何仅缩小Matplotlib中底部两个子图(ax2、ax3)的垂直间距?
解决Matplotlib仅缩小底部两个子图垂直间距的问题
这问题我熟,全局的subplots_adjust(hspace)会统一修改所有子图的垂直间距,肯定满足不了你的需求。这里给你两种精准可控的方案,优先推荐第一种:
方案一:用GridSpec拆分布局(最灵活)
matplotlib.gridspec.GridSpec能把画布拆成独立区域,给每个区域单独设置间距,完美适配你的场景。我们把上方的两个大子图和底部的两个小子图分成两个独立的GridSpec,然后给底部的GridSpec设置更小的hspace:
import matplotlib.pyplot as plt from matplotlib.gridspec import GridSpec fig = plt.figure(figsize=(14, 14)) # 上方区域:9行2列,保持原有的垂直间距0.25 gs_top = GridSpec(9, 2, figure=fig, hspace=0.25) # 底部区域:2行2列,设置更小的垂直间距(比如0.05,你可以按需调整) gs_bottom = GridSpec(2, 2, figure=fig, hspace=0.05) # 添加上方的两个大子图,占满整个上方GridSpec的列 ax0 = fig.add_subplot(gs_top[:, 0]) ax1 = fig.add_subplot(gs_top[:, 1]) # 添加底部的两个子图,分别占底部GridSpec的第1行和第2行 ax2 = fig.add_subplot(gs_bottom[0, :]) ax3 = fig.add_subplot(gs_bottom[1, :]) # 隐藏所有子图的刻度 for ax in (ax0, ax1, ax2, ax3): ax.set_xticks([]) ax.set_yticks([]) # 调整上下两个区域之间的整体间距(可选,按需微调) fig.subplots_adjust(top=0.95, bottom=0.05, wspace=0.02)
为什么推荐这个方案?
- 完全隔离了上下区域的间距设置,底部子图的间距只受
gs_bottom的hspace控制,不会影响上方的大子图 - 布局逻辑清晰,后续如果要调整其他子图的位置或间距,也很容易修改
方案二:手动调整子图位置(快速临时修改)
如果不想改动原有子图的创建代码,也可以手动获取子图的位置,直接调整它们的坐标来缩小间距:
import matplotlib.pyplot as plt fig = plt.figure(figsize=(14, 14)) ax0 = fig.add_subplot(12, 2, (1, 9)) ax1 = fig.add_subplot(12, 2, (2, 10)) ax2 = fig.add_subplot(14, 2, (13, 14)) ax3 = fig.add_subplot(14, 2, (15, 16)) for ax in (ax0, ax1, ax2, ax3): ax.set_xticks([]) ax.set_yticks([]) # 先设置全局间距(保持原有设置) fig.subplots_adjust(hspace=.25, wspace=.02) # 获取底部两个子图的当前位置,格式是[left, bottom, width, height] pos2 = ax2.get_position() pos3 = ax3.get_position() # 把ax3往上挪,缩小和ax2的间距(数值0.03可以按需调整) new_pos3 = [pos3.x0, pos3.y0 + 0.03, pos3.width, pos3.height] ax3.set_position(new_pos3) # 或者反过来把ax2往下挪,效果一样: # new_pos2 = [pos2.x0, pos2.y0 - 0.03, pos2.width, pos2.height] # ax2.set_position(new_pos2)
这个方案的优缺点:
- 优点:不用修改原有子图的创建逻辑,快速生效
- 缺点:手动调整的数值是固定的,如果后续调整画布大小,间距可能会错乱,适合临时调试用
内容的提问来源于stack exchange,提问作者OverLordGoldDragon
相关产品推荐
相关产品推荐

