如何创建自定义数值范围的颜色映射(支持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
相关产品推荐
相关产品推荐

