所以这似乎是一个错误,但它可能是预期的行为。
我的代码如下:
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()
结果是白色图像,而不是预期的黑色图像:
这种行为的奇怪之处在于,取消注释一行,改变一个像素,似乎是修复"问题:
我发现online的最近解释是:
[...]问题在于,使用统一阵列初始化图像时,色彩图的最小值和最大值是相同的。由于我们只是更改数据而不是色彩图,因此所有图像都显示为均匀的颜色。
考虑到这种解释,我该如何解决这种问题?
答案 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
只包含一个值的极端情况下,您可能需要明确设置vmin
和vmax
:
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()
答案 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)。