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

如何移除matplotlib中imshow子图间的水平空白间距

问题描述

需要移除3个垂直排列子图之间的空白间距,已尝试使用gridspec.GridSpec和fig.subplots_adjust两种方法调整参数均未生效,调整过程中需要保留每个子图现有的独立右侧色条。
原实现代码如下:

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.axes_grid1 import make_axes_locatable

# 生成随机测试数据
x1 = np.random.rand(1,10)
x2 = np.random.rand(1,10)
x3 = np.random.rand(1,10)

nrow, ncol = 3, 1
fig, axes = plt.subplots(nrow,ncol, figsize=(12,8))
fig.subplots_adjust(wspace=0.01, hspace=0.01)
axes = axes.flatten()

cmaps = ['Greens_r', 'Reds', 'jet']
x_all = [x1,x2,x3]

for i in range(3):
        im = axes[i].imshow(x_all[i], cmap=cmaps[i])
        axes[i].set_xticklabels([])
        axes[i].set_yticklabels([]) 
        axes[i].set_xticks([])
        axes[i].set_yticks([])
        
        # 在子图右侧创建色条轴
        divider = make_axes_locatable(axes[i])
        cax = divider.append_axes("right", size="5%", pad=0.05)
        fig.colorbar(im, cax=cax)

当前运行效果参考:
子图空白间距问题示例

实现方法

之前间距设置不生效的核心原因是imshow默认会强制子图保持和输入数据匹配的固定宽高比,subplots_adjust的间距参数无法覆盖这个自动布局规则,只需两步调整即可实现零间距效果:

  • 调用imshow时新增aspect='auto'参数,解除子图的固定宽高比限制,允许子图拉伸填充画布分配的空间
  • 保留hspace=0的间距设置,可根据需要微调上下边距避免内容裁切

优化后(增加相邻边框隐藏避免线条重叠)的完整代码:

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.axes_grid1 import make_axes_locatable

# 生成随机测试数据
x1 = np.random.rand(1,10)
x2 = np.random.rand(1,10)
x3 = np.random.rand(1,10)

nrow, ncol = 3, 1
fig, axes = plt.subplots(nrow,ncol, figsize=(12,8))
# 设置垂直方向子图间距为0,调整top/bottom参数避免边缘内容裁切
fig.subplots_adjust(wspace=0, hspace=0, top=0.95, bottom=0.05)
axes = axes.flatten()

cmaps = ['Greens_r', 'Reds', 'jet']
x_all = [x1,x2,x3]

for i in range(3):
        # 新增aspect='auto'解除固定宽高比限制
        im = axes[i].imshow(x_all[i], cmap=cmaps[i], aspect='auto')
        axes[i].set_xticklabels([])
        axes[i].set_yticklabels([]) 
        axes[i].set_xticks([])
        axes[i].set_yticks([])
        
        # 隐藏相邻子图的重叠边框,避免线条变粗
        if i != nrow -1:
            axes[i].spines['bottom'].set_visible(False)
        if i != 0:
            axes[i].spines['top'].set_visible(False)
        
        # 在子图右侧创建独立色条轴
        divider = make_axes_locatable(axes[i])
        cax = divider.append_axes("right", size="5%", pad=0.05)
        fig.colorbar(im, cax=cax)

plt.show()

运行后三个子图会完全贴合无空白,同时每个子图保留独立的右侧色条。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 13:09:16