python-3.x - 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()
结果是白色图像,而不是预期的黑色图像:
这种行为的奇怪之处在于,取消注释一行并改变一个像素似乎“修复”了问题:
我在网上找到的最接近的解释是:
[...] 问题在于,在使用统一数组初始化图像时,颜色图的最小值和最大值是相同的。由于我们只更改数据,而不是颜色图,因此所有图像都显示为统一颜色。
考虑到这种解释,我该如何解决这种行为?
解决方案
如果未指定的vmin
和vmax
参数,则将它们设置为imshow
imshow
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
您可能需要明确设置: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()
推荐阅读
- c - 如何将来自 CPU 的 32 位内存地址映射到 C 中的本地内存
- ruby-on-rails - 带有 pg "rake db:create" 的 Rails
- botium-box - Retrieve Botium error message for IntentAsserter as a Json for mocha reporting
- c - 子进程是否应该比父进程执行得慢?
- php - 显示此站点的 localhost 项目是欺骗性警告
- flutter - Flutter Undraw Widget - 更新后的PictureStream错误
- swift - 如何将单独 Swift 包中的 C 标头包含到另一个 Swift 包的 C 部分中
- react-native - 如何使用 React native 找到解决方案
- ios - ScrollToTtem 不流畅
- geolocation - 为什么通过 IP 地址打开 Prestashop 的地理定位在 PageSpeed Insight 上给我一个 503 错误?