Matplotlib imshow()显示numpy.ones数组异常的修复方法问询
Fix Matplotlib imshow Showing White Instead of Black for Uniform Value Arrays
这确实不是bug,而是Matplotlib imshow()的预期行为——你查到的解释完全正确:当传入的数组所有元素值相同时,imshow()会自动将色图的最小值(vmin)和最大值(vmax)设为同一个值,这时候无法完成有效的归一化映射,所有像素都会被渲染成同一种颜色,刚好和你预期的黑色相反。
要解决这个问题,有几种简单直接的方法:
方法1:手动指定vmin和vmax
最直接的方式是在调用imshow()时,强制指定色图的取值范围,比如你期望的0到1:
import matplotlib.pyplot as pyplot import numpy as np array = np.ones([10, 10]) fig, ax = pyplot.subplots(figsize=(10, 5)) # 手动设置色图的范围,确保1映射到binary色图的黑色 ax.imshow(array, cmap=pyplot.cm.binary, vmin=0, vmax=1) pyplot.show()
方法2:使用轴对象的clim()方法
如果你已经调用了imshow(),也可以通过设置坐标轴的颜色范围来修正:
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) # 强制设置颜色范围 ax.clim(0, 1) pyplot.show()
方法3:手动创建归一化对象
如果需要更灵活的归一化逻辑,可以使用matplotlib.colors.Normalize类:
import matplotlib.pyplot as pyplot import numpy as np from matplotlib.colors import Normalize array = np.ones([10, 10]) fig, ax = pyplot.subplots(figsize=(10, 5)) # 创建归一化对象,指定范围 norm = Normalize(vmin=0, vmax=1) ax.imshow(array, cmap=pyplot.cm.binary, norm=norm) pyplot.show()
这几种方法的核心都是强制色图使用你预期的取值范围,而不是让Matplotlib自动推断。这样即使数组全是1,也会被正确映射到binary色图中对应1的颜色(也就是你想要的黑色)。
内容的提问来源于stack exchange,提问作者Mantas Kandratavičius
相关产品推荐
相关产品推荐

