首页 > 解决方案 > Matplotlib imshow() 不显示 numpy.ones 数组

问题描述

所以这似乎是一个错误,但它可能是预期的行为。

我的代码如下:

import matplotlib.pyplot    as pyplot
import numpy                as np

array = np.ones([10, 10])
# array[0, 0] = 0

fig, ax = pyplot.subplots(figsize=(10, 5))
ax.imshow(array, cmap=pyplot.cm.binary)
pyplot.show()

结果是白色图像,而不是预期的黑色图像:

所有像素都是白色的

这种行为的奇怪之处在于,取消注释一行并改变一个像素似乎“修复”了问题:

除一个像素外,所有像素均为黑色

我在网上找到的最接近的解释是:

[...] 问题在于,在使用统一数组初始化图像时,颜色图的最小值和最大值是相同的。由于我们只更改数据,而不是颜色图,因此所有图像都显示为统一颜色。

考虑到这种解释,我该如何解决这种行为?

标签: python-3.xnumpymatplotlibimshow

解决方案


如果未指定vminvmax参数,则将它们设置为imshowimshow

vmin = array.min()   # in this case, vmin=1
vmax = array.max()   # in this case, vmax=1

然后,默认使用将值标准化array为介于 0 和 1 之间matplotlib.colors.Normalize

In [99]: norm = mcolors.Normalize(vmin=1, vmax=1)

In [100]: norm(1)
Out[100]: 0.0

因此,每个点array都映射到与 0.0 关联的颜色:

In [101]: plt.cm.binary(0)
Out[101]: (1.0, 1.0, 1.0, 1.0)  # white

通常array会包含各种值,matplotlib 的规范化只会自动为您“做正确的事”。但是,在这些仅包含一个值的极端情况下,array您可能需要明确设置:vminvmax

import matplotlib.pyplot    as pyplot
import numpy                as np

array = np.ones([10, 10])
fig, ax = pyplot.subplots(figsize=(10, 5))
ax.imshow(array, cmap=pyplot.cm.binary, vmin=0, vmax=1)
pyplot.show()

在此处输入图像描述



推荐阅读