Matplotlib调用subplots时gridspec_kw的wspace参数不生效问题求助
问题成因
- 水平间距不生效的核心原因是
imshow默认开启等比例显示(aspect='equal'),如果创建的画布尺寸和4张图拼接后的总宽高比不匹配,matplotlib会自动缩放子图大小适配图像比例,导致wspace=0的设置被覆盖,子图之间自动留出填充间隙。 - 导出后垂直方向存在细微白缝,是因为默认画布自带上下左右的边距,同时子图轴脊、导出参数的默认padding也会残留少量空白像素。
解决方案
你可以通过精确匹配画布尺寸、移除所有额外边距的方式实现完全无间距拼接,修改后的代码如下:
import matplotlib.pyplot as plt # 取单张图的高、宽像素值,所有待拼接图尺寸需一致 h, w = map1.shape[:2] export_dpi = 150 # 按拼接后总像素尺寸精准设置画布大小,避免比例适配带来的额外间隙 fig = plt.figure(figsize=(2*w/export_dpi, 2*h/export_dpi), dpi=export_dpi) gs = fig.add_gridspec(2, 2, hspace=0, wspace=0) axs = gs.subplots() (ax1, ax2), (ax3, ax4) = axs # 展示图像时保持原始比例 ax1.imshow(map1, aspect='equal') ax1.axis('off') ax2.imshow(map2, aspect='equal') ax2.axis('off') ax3.imshow(map3, aspect='equal') ax3.axis('off') ax4.imshow(map4, aspect='equal') ax4.axis('off') # 仅保留最外侧刻度,同时移除所有轴脊避免残留边界 for ax in axs.flat: ax.label_outer() ax.spines[:].set_visible(False) # 完全移除画布全局边距 plt.subplots_adjust(left=0, right=1, bottom=0, top=1, hspace=0, wspace=0) # 导出时关闭所有padding,避免白缝 plt.savefig('map4x4.png', dpi=export_dpi, bbox_inches='tight', pad_inches=0)
核心修改点说明
- 根据拼接后图像的总像素和导出dpi反向计算画布尺寸,从根源避免子图缩放导致的间隙,不需要设置负的
wspace - 显式移除所有子图的轴脊,消除1像素级的残留边界
- 调整画布全局边距为0,覆盖默认的画布空白
- 导出时设置
pad_inches=0,完全移除导出环节的额外空白
内容的提问来源于stack exchange,提问作者Cara_CH
相关产品推荐
相关产品推荐

