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

如何消除Matplotlib中subplot_mosaic的子图间隙?传统方法失效

解决Matplotlib subplot_mosaic子图间隙无法消除的问题

你遇到的问题核心在于使用了layout="constrained"布局模式——这个模式会完全接管子图间距的控制逻辑,导致gridspec_kw里的wspace/hspace以及传统的plt.subplots_adjust()都失效。下面给两种可行的解决办法:

方法一:关闭Constrained Layout,改用Gridspec控制间距

直接去掉layout="constrained"参数(或设为None),让Matplotlib使用默认布局,此时gridspec_kw里的间距设置就能生效:

import matplotlib.pyplot as plt
import numpy as np

# 移除layout="constrained",使用默认布局
fig = plt.figure()
ax_dict = fig.subplot_mosaic(
    """
    abcde
    fghiX
    jklXX
    mnXXX
    oXXXX
    """,
    empty_sentinel="X",
    gridspec_kw={
        "wspace": 0,
        "hspace": 0,
    },
)

for k, ax in ax_dict.items():
    # 清除刻度和标签
    ax.set_xticklabels([])
    ax.set_yticklabels([])
    ax.tick_params(length=0)
    # 移除子图内部边距,让内容完全贴合边框
    ax.margins(0)

plt.show()

方法二:在Constrained Layout下调整填充参数

如果必须保留constrained布局,可以通过调整布局的整体填充和子图边距来消除间隙:

import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure(layout="constrained")
ax_dict = fig.subplot_mosaic(
    """
    abcde
    fghiX
    jklXX
    mnXXX
    oXXXX
    """,
    empty_sentinel="X",
)

# 调整Constrained Layout的全局填充,设为0
fig.set_constrained_layout_pads(w_pad=0, h_pad=0, hspace=0, wspace=0)

for k, ax in ax_dict.items():
    ax.set_xticklabels([])
    ax.set_yticklabels([])
    ax.tick_params(length=0)
    # 移除子图内部边距
    ax.margins(0)

plt.show()

另外注意你的代码里有个小问题:ax = plt.figure(...).subplot_mosaic(...)之后,循环里又用ax作为子图变量名,会覆盖之前的字典对象,建议改成ax_dict这样的名字避免冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 15:47:13