import matplotlib.pyplot as plt
import numpy as np
n = 16
im = np.eye(n)
fig = plt.figure()
ax = fig.add_subplot(121)
ax.imshow(im)
ax = fig.add_subplot(122)
ax.imshow(im, extent=(0, n, 0, n))
plt.show()
我原本预料到这个extent
,两个数字(几乎)相同,但它们不是:注意y轴是如何翻转的。更令人讨厌的是,右边的数字是错误的:原点的值显示为0,而它是1。
如果我在范围extent=(0, n, n, 0)
中翻转y参数,我会得到预期的行为。
据我了解,imshow
的extent
参数的说明,
范围:标量(左,右,下,上),可选,默认:
None
数据坐标中左下角和右上角的位置。如果
None
,图像的位置使得像素中心落在从零开始(行,列)的索引上。
对这种行为并不十分明确。
我的问题是,为什么会发生这种转变,为什么我们必须在一定程度上反转顶部/底部以获得预期的行为?
修改
我已阅读this question,OP没有提及翻转问题,答案也没有提出问题。
设置origin='lower'
元素确实会将第一个图像像素置于(0,0)
,但图像会颠倒显示。
我确信有一个简单的解释可以一致地解释这些行为,但还不能确定。
答案 0 :(得分:3)
imshow
有一个参数origin
。默认值为origin="upper"
。这与extent
的设置冲突,根据文档,它应设置左下角和右上角的数据坐标中的位置。"但是,只有设置origin = "lower"
时才会出现这种情况。
"如果您将原点设置为" upper"您可以使用范围和/或ylim指定的任何y坐标都需要反转。"
这正是您自己已经发现的。所以选项是:
如果您希望图像来自左上角:
origin="upper", extent=(0, n, n, 0)
如果您希望图像来自左下角:
origin="lower", extent=(0, n, 0, n)