Matplotlib imshow()不显示numpy.ones数组

时间:2018-05-12 00:59:51

标签: python-3.x numpy matplotlib imshow

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

我的代码如下:

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

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

All pixels are white

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

All but one pixels are black

我发现online的最近解释是:

  

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

考虑到这种解释,我该如何解决这种问题?

2 个答案:

答案 0 :(得分:1)

如果imshow的{​​{3}}未指定,则imshow将其设为

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

然后the vmin and vmax parameters 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()

normalizes

答案 1 :(得分:0)

您可以使用显式颜色而不是颜色映射来回避此问题:

array = np.zeros((10, 10, 3), 'u1')
#array[0, 0, :] = 255

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

这样,零表示黑色,(255,255,255)表示白色(RGB)。