如何基于数值为Matplotlib设置指定自定义颜色?
解决指定数值对应固定颜色(含透明)的问题
问题根源
默认情况下plt.imshow()会根据数组里实际存在的数值自动生成颜色映射,比如当数组里没有值2时,原本给2分配的绿色会被挪给3,直接导致颜色对应关系全乱;而且默认映射也没法实现0值透明的需求。
修复方法
用matplotlib.colors.ListedColormap创建固定顺序的颜色映射,再搭配BoundaryNorm强制每个数值绑定固定的颜色区间,不管数组里有没有这个值都不会错位。
完整可运行代码
import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import ListedColormap, BoundaryNorm size = (601, 1031) # 生成测试数据(模拟可能缺失部分值的场景) coordinatesMRE = np.random.randint(0, 5, size) # 手动移除所有值2,验证错位问题是否解决 coordinatesMRE[coordinatesMRE == 2] = 1 fig, ax = plt.subplots() # 加载背景底图 img = plt.imread("map.png") ax.imshow(img, aspect='auto') plt.axis('off') # 定义颜色映射:索引对应数值0-4,RGBA格式,0设为完全透明 color_list = [ (0, 0, 0, 0), # 0: 透明 (0, 0, 1, 1), # 1: 蓝色 (0, 1, 0, 1), # 2: 绿色 (1, 0, 0, 1), # 3: 红色 (1, 0.5, 0, 1) # 4: 橙色 ] custom_cmap = ListedColormap(color_list) # 设置边界值,确保每个数值对应独立的颜色区间 # 边界数量 = 类别数 + 1,这里0-4共5个类别,边界范围是[-0.5, 0.5, 1.5, 2.5, 3.5, 4.5] bounds = np.arange(-0.5, 5, 1) norm = BoundaryNorm(bounds, custom_cmap.N) # 绘制数组,指定自定义颜色映射和归一化规则 ax.imshow(coordinatesMRE, cmap=custom_cmap, norm=norm, aspect='auto') plt.show()
核心要点
ListedColormap:严格按照索引顺序绑定数值与颜色,索引0对应数值0,不会因为数值缺失乱序BoundaryNorm:通过设置区间边界,让每个数值都落在专属的颜色区间里,彻底避免缺失值导致的颜色错位- 透明效果:用RGBA格式的颜色,将alpha通道(第四位)设为0实现,比直接用
None更可靠
内容的提问来源于stack exchange,提问作者Akael
相关产品推荐
相关产品推荐

