【问题标题】:Why can't imshow show a matrix full of ones properly?为什么 imshow 不能正确显示一个充满矩阵的矩阵?
【发布时间】:2020-02-19 03:58:47
【问题描述】:

这是一个简单的可重现代码:

import numpy as np
import matplotlib.pyplot as plt

plt.figure()
img = np.ones((3,3))
plt.imshow(img)
plt.figure()
plt.imshow(np.array([1,1,1,1,0,1,1,1,1]).reshape(3,3))

它会给你如下图:

即使你使用

plt.imshow(img.astype(float)) or
plt.imshow(img*255)

它仍然是相同的图像。

我只需要 Matplotlib 将第一张图像作为黄色图像给我,就像第二张图像一样。

【问题讨论】:

    标签: python matplotlib imshow


    【解决方案1】:

    显式使用imshowvminvmax参数:

    当使用标量数据且没有明确的 norm 时,vminvmax 定义颜色图覆盖的数据范围。默认情况下,颜色图覆盖所提供数据的完整值范围。如果使用了 norm 参数,vminvmax 将被忽略。

    import numpy as np
    import matplotlib.pyplot as plt
    
    plt.figure()
    img = np.ones((3, 3))
    plt.imshow(img, vmin=0, vmax=1)
    plt.figure()
    plt.imshow(np.array([1, 1, 1, 1, 0, 1, 1, 1, 1]).reshape(3, 3))
    plt.show()
    

    对于第二个示例,数据范围是[0 ... 1],因此默认情况下颜色会相对于该范围进行缩放。但是,对于第一个示例,[0 ... 1] 的所需数据范围无法从数据本身(全部)中提取,因此您必须明确提供该信息。

    希望有帮助!

    ----------------------------------------
    System information
    ----------------------------------------
    Platform:    Windows-10-10.0.16299-SP0
    Python:      3.8.1
    Matplotlib:  3.2.0rc3
    NumPy:       1.18.1
    ----------------------------------------
    

    【讨论】:

    • 谢谢!我没有意识到 matplotlib 实际上试图根据 [min, max] 对图像进行归一化......真的很感谢
    猜你喜欢
    • 2022-01-18
    • 2020-07-16
    • 2011-12-13
    • 1970-01-01
    • 1970-01-01
    • 2017-07-08
    • 1970-01-01
    • 2020-10-20
    • 1970-01-01
    相关资源
    最近更新 更多