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

如何创建自定义数值范围的颜色映射(支持HTML颜色代码)

自定义数值范围的Matplotlib颜色映射(支持HTML色值)

核心实现方案

要精准控制每个数值区间对应的颜色(支持HTML色码),可以结合matplotlib.colors.ListedColormap(离散区间配色)或LinearSegmentedColormap(区间内渐变过渡),搭配BoundaryNorm绑定区间与颜色的对应关系,完全满足类似turbo/terrain的自定义配色需求。

分步实现(以NDVI为例)


1. 定义区间与对应颜色

先明确数值区间和目标颜色(直接用HTML色值字符串即可):

# NDVI数值边界(需按从小到大排序)
ndvi_bounds = [-1, 0.2, 0.4, 0.6, 0.8, 1]
# 对应区间的HTML颜色(数量需比边界少1)
ndvi_colors = [
    "#000000",   # <0.2 黑色
    "#8B4513",   # 0.2-0.4 棕色
    "#FFFF00",   # 0.4-0.6 黄色
    "#008000",   # 0.6-0.8 绿色
    "#006400"    # >0.8 深绿色
]

2. 创建颜色映射与区间规则

如果是离散区间配色(每个区间固定单一颜色),用ListedColormap + BoundaryNorm:

import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap, BoundaryNorm

# 创建自定义colormap
cmap = ListedColormap(ndvi_colors)
# 绑定区间与颜色的映射规则
norm = BoundaryNorm(ndvi_bounds, cmap.N)

如果需要区间内渐变过渡(类似terrain的平滑渐变效果),用LinearSegmentedColormap定义分段渐变:

from matplotlib.colors import LinearSegmentedColormap

# 计算数值区间的相对比例,用于映射到0-1的颜色控制点
total_range = ndvi_bounds[-1] - ndvi_bounds[0]
color_points = {'red': [], 'green': [], 'blue': []}

# 给每个区间端点添加颜色映射
for i in range(len(ndvi_bounds)):
    pos = (ndvi_bounds[i] - ndvi_bounds[0]) / total_range
    # 解析HTML色值为0-1范围的RGB值
    hex_color = ndvi_colors[min(i, len(ndvi_colors)-1)]
    r = int(hex_color[1:3], 16)/255
    g = int(hex_color[3:5], 16)/255
    b = int(hex_color[5:7], 16)/255
    color_points['red'].append((pos, r, r))
    color_points['green'].append((pos, g, g))
    color_points['blue'].append((pos, b, b))

# 创建渐变colormap
cmap = LinearSegmentedColormap('custom_ndvi', color_points)

3. 应用到绘图

以热力图为例:

import numpy as np

# 生成模拟NDVI数据
ndvi_data = np.random.uniform(-1, 1, (10, 10))

# 绘图
fig, ax = plt.subplots()
# 离散配色需传入norm参数,渐变配色可省略
im = ax.imshow(ndvi_data, cmap=cmap, norm=norm)

# 添加颜色条并标注刻度
cbar = plt.colorbar(im, ticks=ndvi_bounds)
cbar.set_label('NDVI Value')
plt.show()

关键注意事项

  • 数值边界必须按从小到大排序,否则映射逻辑会出错
  • 离散配色时,颜色列表的长度必须比边界列表少1(每个边界区间对应一个颜色)
  • HTML色值支持所有标准格式,如#FFF、#FFFFFF、rgb(0,0,0)均可直接使用

内容的提问来源于stack exchange,提问作者Mars

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 18:50:31