You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于数值为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 08:20:32