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

如何修复matplotlib imshow绘图时坐标轴与图像重叠遮挡的问题

问题根源

imshow和其封装方法matshow默认将矩阵每个单元格的中心对齐到整数索引坐标,以50×50的矩阵为例,第一个单元格(索引[0,0])的中心坐标是(0,0),最后一个单元格(索引[49,49])的中心坐标是(49,49)。而matplotlib默认将坐标轴脊线绘制在坐标0和49的位置,刚好压在边缘单元格的中线上,直接遮挡了半个单元格的内容,同时默认的轴边距、比例设置也会导致单元格无法显示为标准正方形。


修复方案

以下三种方法都可以完整展示所有矩阵元素,保证每个单元格大小一致、为正方形:

方法1:显式设置轴范围对齐单元格边界(最稳妥通用)

手动将x、y轴的范围对齐到所有单元格的外边缘,同时强制轴等比例:

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(3,3))
data = np.random.random((50, 50))
ax.matshow(data, interpolation="none", cmap="Blues")

# 核心修复逻辑
n_rows, n_cols = data.shape
ax.set_xlim(-0.5, n_cols - 0.5)
ax.set_ylim(n_rows - 0.5, -0.5)  # matshow默认y轴倒置,上限设为-0.5保证第一行在顶部
ax.set_aspect("equal")  # 强制x/y轴单位长度1:1,确保单元格为正方形

plt.savefig("fixed_example.png", dpi=300)

方法2:偏移坐标轴脊线位置

如果不需要调整轴范围,直接把四个方向的坐标轴脊线向外偏移半个单元格宽度,避开绘图内容即可:

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(3,3))
data = np.random.random((50, 50))
ax.matshow(data, interpolation="none", cmap="Blues")

# 核心修复逻辑
for spine in ax.spines.values():
    spine.set_position(("outward", 0.5))  # 向外偏移0.5个数据单位,对齐单元格外边缘
ax.set_aspect("equal")

plt.savefig("fixed_example2.png", dpi=300)

方法3:传入extent参数在绘图时指定坐标范围

调用绘图函数时直接通过extent参数指定坐标范围,不需要后续单独调整轴属性:

import numpy as np
import matplotlib.pyplot as plt

fig, ax = plt.subplots(figsize=(3,3))
data = np.random.random((50, 50))
n_rows, n_cols = data.shape

# 核心:extent参数顺序为[xmin, xmax, ymin, ymax]
ax.matshow(data, interpolation="none", cmap="Blues",
           extent=[-0.5, n_cols-0.5, n_rows-0.5, -0.5])
ax.set_aspect("equal")

plt.savefig("fixed_example3.png", dpi=300)

提示:保存图片时可以给savefig加上bbox_inches="tight"参数,自动裁剪多余白边,避免边缘内容被画布边界裁剪。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 17:36:19