Matplotlib imshow如何为特定数值绑定对应的映射颜色?
固定0/1数值到指定颜色的实现方法
你之前的方案存在映射不稳定的核心原因是imshow默认会对输入矩阵的数值做自动归一化处理,将矩阵的最小值映射到色卡的第一个颜色,最大值映射到色卡的最后一个颜色,因此没有绑定固定的数值-颜色对应关系。可以通过以下两种简便方法实现需求:
方法1:添加vmin/vmax参数固定映射区间
适合仅需要映射连续整数数值的场景,直接在imshow调用时指定归一化的上下限即可:
import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap # 颜色列表顺序对应数值从小到大的映射:数值0→grey,数值1→blue custom_cmap = ListedColormap(['grey', 'blue']) # vmin=0固定色卡起始值对应数值0,vmax=1固定色卡终止值对应数值1 plt.imshow([[1,0],[0,1]], cmap=custom_cmap, vmin=0, vmax=1) plt.show()
方法2:使用BoundaryNorm明确边界映射
适合数值不连续、需要严格控制数值边界对应关系的场景,稳定性更高:
import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap, BoundaryNorm custom_cmap = ListedColormap(['grey', 'blue']) # 定义边界:小于0.5的数值映射第一个颜色,0.5~1.5之间的数值映射第二个颜色 # 刚好可以精准匹配整数0和1的映射需求,不会出现数值偏移问题 custom_norm = BoundaryNorm([-0.5, 0.5, 1.5], custom_cmap.N) plt.imshow([[1,0],[0,1]], cmap=custom_cmap, norm=custom_norm) plt.show()
如果需要扩展更多数值的映射,只需要对应扩充颜色列表、调整vmin/vmax范围或BoundaryNorm的边界列表即可。
内容的提问来源于stack exchange,提问作者lorenzori
相关产品推荐
相关产品推荐

