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

Matplotlib中imshow绘制网格子图列间存在空白的问题与解决

解决Matplotlib网格子图(imshow)列间空白问题

问题背景

使用Matplotlib绘制m行n列的网格子图,要求子图共享x/y轴且无任何空白间隔。使用plot函数时,通过以下代码可正常实现需求:

import matplotlib.pyplot as plt
import numpy as np

def plot_me():
    n = 4
    m = 5
    f, axs = plt.subplots(m, n, sharex=True, sharey=True, gridspec_kw=dict(hspace=0, wspace=0))
    x = np.arange(44)
    for i in range(m):
        for j in range(n):
            axs[i,j].plot(np.sin(x*(i*j+1)))
    plt.show()

但将plot替换为imshow后,子图列间出现垂直空白(行间无空白),尝试f.subplots_adjust(wspace=0, hspace=0)及mosaic绘图方式均无法解决。当前环境:Python 3.11.2、VS Code 1.78.2、Matplotlib 3.7.1。

两种有效解决方案

方案1:使用pcolormesh替代imshow

imshow默认会自动调整轴的宽高比适配图像尺寸,这是导致子图间隙的核心原因。改用pcolormesh可规避该问题,代码示例:

import matplotlib.pyplot as plt
import numpy as np

def plot_me_imshow_fix():
    n = 4
    m = 5
    f, axs = plt.subplots(m, n, sharex=True, sharey=True, gridspec_kw=dict(hspace=0, wspace=0))
    # 生成测试图像数据
    img_data = np.random.rand(10,10)
    for i in range(m):
        for j in range(n):
            axs[i,j].pcolormesh(img_data, cmap='viridis')
            # 隐藏刻度线和标签(可选,优化布局整洁度)
            axs[i,j].set_xticks([])
            axs[i,j].set_yticks([])
    plt.show()

方案2:强制设置子图宽高比

通过set_aspect方法强制指定子图宽高比,让所有子图尺寸统一,消除列间隙。示例中设置为1.5(可根据自身图像尺寸调整):

import matplotlib.pyplot as plt
import numpy as np

def plot_me_imshow_fix():
    n = 4
    m = 5
    f, axs = plt.subplots(m, n, sharex=True, sharey=True, gridspec_kw=dict(hspace=0, wspace=0))
    img_data = np.random.rand(10,10)
    for i in range(m):
        for j in range(n):
            axs[i,j].imshow(img_data, cmap='viridis')
            # 强制宽高比为1.5
            axs[i,j].set_aspect(1.5)
            axs[i,j].set_xticks([])
            axs[i,j].set_yticks([])
    plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 08:22:15