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

如何用Matplotlib的GridSpec实现跨1.5列宽的子图布局?

用Matplotlib GridSpec实现指定子图布局的解决方案

可行方案说明

完全可以实现你要的布局,核心思路是通过拆分细粒度网格或者嵌套GridSpec来规避全局width_ratios的限制,以下是两种具体实现方式:

方法1:拆分细粒度网格列

将整个画布的列拆分为6个等宽的小列(因为1.5列和1列的最小公倍数是3,拆成6列后,1.5列对应3个小列,1列对应2个小列),通过切片指定子图的跨度:

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

fig = plt.figure(figsize=(10, 6))
# 创建2行6列的GridSpec
gs = GridSpec(2, 6, figure=fig)

# 第一行子图:各占3个小列(对应1.5个基础列宽度)
ax1 = fig.add_subplot(gs[0, 0:3])
ax1.set_title('子图1(跨1.5列)')
ax2 = fig.add_subplot(gs[0, 3:6])
ax2.set_title('子图2(跨1.5列)')

# 第二行子图:各占2个小列(对应1个基础列宽度)
ax3 = fig.add_subplot(gs[1, 0:2])
ax3.set_title('子图3(1列)')
ax4 = fig.add_subplot(gs[1, 2:4])
ax4.set_title('子图4(1列)')
ax5 = fig.add_subplot(gs[1, 4:6])
ax5.set_title('子图5(1列)')

plt.tight_layout()
plt.show()

方法2:嵌套GridSpec

通过外层GridSpec拆分行,内层GridSpec分别控制每行的列比例,这样每行的width_ratios独立互不影响:

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

fig = plt.figure(figsize=(10, 6))
# 外层GridSpec:2行1列,拆分上下两行
outer_gs = GridSpec(2, 1, figure=fig)

# 第一行内层GridSpec:1行2列,宽度比例1.5:1.5
inner_gs_top = GridSpecFromSubplotSpec(1, 2, subplot_spec=outer_gs[0], width_ratios=[1.5, 1.5])
ax1 = fig.add_subplot(inner_gs_top[0])
ax1.set_title('子图1(跨1.5列)')
ax2 = fig.add_subplot(inner_gs_top[1])
ax2.set_title('子图2(跨1.5列)')

# 第二行内层GridSpec:1行3列,宽度比例1:1:1
inner_gs_bottom = GridSpecFromSubplotSpec(1, 3, subplot_spec=outer_gs[1], width_ratios=[1, 1, 1])
ax3 = fig.add_subplot(inner_gs_bottom[0])
ax3.set_title('子图3(1列)')
ax4 = fig.add_subplot(inner_gs_bottom[1])
ax4.set_title('子图4(1列)')
ax5 = fig.add_subplot(inner_gs_bottom[2])
ax5.set_title('子图5(1列)')

plt.tight_layout()
plt.show()

原理说明

  • 方法1通过拆分更细的网格列,将非整数的列跨度转化为整数切片,直观且易调整;
  • 方法2利用嵌套GridSpec实现行级别的列比例控制,完美规避全局width_ratios的限制,逻辑上更贴合你对布局的描述。

两种方法都能精准实现你需要的布局效果。


内容的提问来源于stack exchange,提问作者K. Shores

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 07:00:02