为何plt.imshow与plt.scatter的坐标方向相反?
为什么Matplotlib中NumPy数组索引和绘图坐标轴方向倒置?
核心原因:图像存储/显示惯例与数学坐标系的差异
NumPy数组的存储逻辑:
数字图像的像素数据普遍遵循从上到下、从左到右的存储顺序,NumPy数组直接沿用了这个规则:数组的第一个维度对应图像的垂直行,第二个维度对应水平列。比如img[i,j]指的是第i行(从上往下数)、第j列(从左往右数)的像素。Matplotlib
imshow的显示规则:
为了和图像行业的显示惯例对齐,imshow默认将数组的第一轴(行)映射到绘图的y轴(垂直方向),且把图像的左上角对齐到坐标轴的(0,0)位置——这和数学里“原点在左下角、y轴向上”的右手坐标系完全相反。scatter与imshow的坐标系冲突:scatter函数直接使用Matplotlib的默认数学坐标系(原点在左下角,y轴向上),而imshow默认使用图像显示坐标系(原点在左上角,y轴向下)。这就导致你示例中:img[2,4]在imshow里的位置是x=4,y=2(以坐标轴左上角为原点)plt.scatter(2,4)的位置是x=2,y=4(以坐标轴左下角为原点)
两者自然呈现对角线镜像效果。
解决方法:让坐标系统一
你可以通过两种方式让数组索引和绘图坐标对齐:
修改
imshow的原点为左下角,匹配数学坐标系:import numpy as np import matplotlib.pyplot as plt img = np.zeros((10, 10)) img[2, 4] = 1 plt.imshow(img, origin='lower') # 原点设为左下角 plt.scatter(4, 2) # 数组(行2,列4)对应坐标轴x=4,y=2 plt.show()调整
scatter的y坐标,适配imshow的默认原点:import numpy as np import matplotlib.pyplot as plt img = np.zeros((10, 10)) img[2, 4] = 1 plt.imshow(img) # 数组行索引i对应坐标轴y = 数组行数-1 - i plt.scatter(4, img.shape[0] - 1 - 2) plt.show()
内容的提问来源于stack exchange,提问作者rohlemax
相关产品推荐
相关产品推荐

