如何消除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
相关产品推荐
相关产品推荐

