为什么imshow的范围论证会翻转我的图像?

时间:2017-07-21 12:57:35

标签: python matplotlib

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()

结果如下图所示 enter image description here

我原本预料到这个extent,两个数字(几乎)相同,但它们不是:注意y轴是如何翻转的。更令人讨厌的是,右边的数字是错误的:原点的值显示为0,而它是1。

如果我在范围extent=(0, n, n, 0)中翻转y参数,我会得到预期的行为。

据我了解,imshowextent参数的说明,

  

范围:标量(左,右,下,上),可选,默认:None

     

数据坐标中左下角和右上角的位置。如果None,图像的位置使得像素中心落在从零开始(行,列)的索引上。

对这种行为并不十分明确。

我的问题是,为什么会发生这种转变,为什么我们必须在一定程度上反转顶部/底部以获得预期的行为?

修改

我已阅读this question,OP没有提及翻转问题,答案也没有提出问题。

设置origin='lower'元素确实会将第一个图像像素置于(0,0),但图像会颠倒显示。

我确信有一个简单的解释可以一致地解释这些行为,但还不能确定。

1 个答案:

答案 0 :(得分:3)

imshow有一个参数origin。默认值为origin="upper"。这与extent的设置冲突,根据文档,它应设置左下角和右上角的数据坐标中的位置。"但是,只有设置origin = "lower"时才会出现这种情况。

have already proposed使用像

这样的句子来扩展文档
  

"如果您将原点设置为" upper"您可以使用范围和/或ylim指定的任何y坐标都需要反转。"

这正是您自己已经发现的。所以选项是:

  • 如果您希望图像来自左上角:

    origin="upper", extent=(0, n, n, 0)
    
  • 如果您希望图像来自左下角:

    origin="lower", extent=(0, n, 0, n)