为什么 imshow 的范围参数会翻转我的图像?

P-G*_*-Gn 3 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()
Run Code Online (Sandbox Code Playgroud)

结果如下图 在此处输入图片说明

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

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

据我了解, 的extent论点的描述imshow

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

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

对这种行为并不是很明确。

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

编辑

我已经阅读了这个问题,OP 没有提到翻转问题,答案也没有带来问题。

设置origin='lower'元素确实带来了第一个图像像素,(0,0)但图像随后颠倒显示。

我相信有一个简单的解释可以始终如一地解释这些行为,但还不能完全确定。

Imp*_*est 5

imshow有一个参数origin。默认值为origin="upper". 这与 的设置冲突extent,根据文档,它应该设置“左下角和右上角的数据坐标位置”。然而,这仅在origin = "lower"设置时才成立。

已经提议用这样的句子来扩展文档

“如果您将原点设置为“上”任何 y 坐标,您可以使用范围和/或 ylim 指定需要反转。”

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