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

2023-12-04

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

results in the following figure enter image description here

我本以为有了这个extent,两个图(几乎)相同,但它们并不相同:注意 y 轴是如何翻转的。更可气的是,右边的数字是错误的:原点处的值显示为0,而实际上是1。

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

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

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

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

对于这种行为并没有真正明确。

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

EDIT

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

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

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


The imshow有争论origin。默认为origin="upper"。这与设置冲突extent,根据文档,应该设置“左下角和右上角的数据坐标位置”。然而,这仅在以下情况下成立:origin = "lower"已设置。

I 已经提议了用类似这样的句子来扩展文档

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

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

  • 如果您希望图像位于左上角:

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

    origin="lower", extent=(0, n, 0, n)
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐