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

ax.add_patch()存在坐标缩放不一致问题:matshow非正方矩阵时圆形适配异常

问题原因

你遇到的问题本质是坐标轴纵横比设置导致的坐标单位长度不匹配:
matshow 方法默认开启了 aspect="equal" 配置,该配置会强制x轴和y轴的1个数据单位对应完全相同的屏幕像素长度。

  • 当使用行列数相近的矩阵时,绘图区域可以正常适配画布尺寸,每个单元格保持正方形,半径0.5数据单位的圆形自然可以刚好嵌套进单元格。
  • 当使用5行50列这类行列数差异极大的矩阵时,为了维持等比例规则,绘图区域会被自动缩放。如果你没有对应调整画布尺寸,或是手动设置了 aspect="auto" 让绘图区域填满画布,就会导致x轴和y轴的1个数据单位对应的像素长度不再相等:y方向1数据单位的像素长度远大于x方向,半径0.5数据单位的圆形在y方向刚好适配单元格高度,但在x方向就会远超过单元格宽度,最终呈现出超出单元格的效果。

解决方案

方案一:调整画布尺寸适配矩阵比例

如果你希望单元格保持正方形,只需要设置画布的宽高比和矩阵的列行比一致即可:

import matplotlib.pyplot as plt
from matplotlib.patches import Circle
import numpy as np

# 50列5行,宽高比设置为10:1即可适配,可根据需求微调预留边距
fig, ax = plt.subplots(figsize=(10, 1), dpi=500)
mat = np.random.random((5,50))
ax.matshow(mat)
ax.add_patch(Circle((2,2), .5, color='white'))

plt.show()

方案二:改用椭圆适配任意纵横比

如果你需要让绘图区域填满画布,允许单元格为长方形,可以直接用Ellipse替代Circle,分别指定x、y方向的直径为1数据单位即可,无需调整画布尺寸:

import matplotlib.pyplot as plt
from matplotlib.patches import Ellipse
import numpy as np

fig, ax = plt.subplots(dpi=500)
mat = np.random.random((5,50))
ax.matshow(mat)
# 中心坐标保持(2,2),宽高均设置为1个数据单位
ax.add_patch(Ellipse((2,2), width=1, height=1, color='white'))

plt.show()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:24:04