Matplotlib中定义以整数为中心的自定义颜色映射方法
自定义Matplotlib颜色映射实现整数中心的颜色定位
我尝试在Matplotlib中使用一种以整数为中心「定位」颜色的颜色映射。例如,当绘制的数据范围为[-1,1]时,能清晰区分-1、0、1附近的数据,原有实现代码如下:
fig, axs = plt.subplots(1, 1) cmap = mpl.cm.coolwarm levels = np.arange(-1.2,1.21,.01) cs = axs.contourf(x_list,y_list,z_list,levels=levels, cmap=cmap) bounds = [-1, 0, 1] norm = mpl.colors.BoundaryNorm(bounds, cmap.N) cbar = fig.colorbar(cs)该代码效果良好,-1附近的数据显示为蓝色,0附近为灰色,1附近为红色。现在需要处理范围为[-2,2]的数据,希望-2附近显示品红色(magenta)、2附近显示绿色,请问如何定义自定义颜色映射并修改上述代码实现?
实现步骤
要满足需求,需自定义分段线性颜色映射,并配合BoundaryNorm绑定整数边界,具体操作如下:
定义颜色关键点:
按需求指定各整数点对应的目标颜色,同时保留过渡自然性:- -2 → 品红色 (
magenta) - -1 → 蓝色 (
blue) - 0 → 灰色 (
gray) - 1 → 红色 (
red) - 2 → 绿色 (
green)
- -2 → 品红色 (
创建自定义颜色映射:
使用matplotlib.colors.LinearSegmentedColormap将颜色关键点转换为可直接调用的色图。调整边界与归一化:
更新bounds为[-2, -1, 0, 1, 2],让BoundaryNorm依据这些整数边界划分颜色区间。适配绘图与色条:
调整levels覆盖稍大于数据范围的区间,确保边缘颜色显示正确,并在contourf和色条中应用自定义色图与归一化规则。
修改后的完整代码
import matplotlib as mpl import matplotlib.pyplot as plt import numpy as np # 示例数据集(实际使用时替换为你的x_list, y_list, z_list) x_list, y_list = np.meshgrid(np.linspace(-3, 3, 100), np.linspace(-3, 3, 100)) z_list = np.sin(x_list) * np.cos(y_list) * 2 # 生成范围约[-2,2]的数据 fig, axs = plt.subplots(1, 1) # 1. 定义颜色关键点并生成自定义色图 color_points = [(-2, 'magenta'), (-1, 'blue'), (0, 'gray'), (1, 'red'), (2, 'green')] # 将数值归一到[0,1]区间,适配LinearSegmentedColormap要求 cmap_entries = [((val + 2)/4, color) for val, color in color_points] custom_cmap = mpl.colors.LinearSegmentedColormap.from_list('custom_cmap', cmap_entries) # 2. 设置边界与归一化规则 bounds = [-2, -1, 0, 1, 2] norm = mpl.colors.BoundaryNorm(bounds, custom_cmap.N) # 3. 绘制contourf,levels覆盖稍宽于数据范围的区间 levels = np.arange(-2.2, 2.21, 0.01) cs = axs.contourf(x_list, y_list, z_list, levels=levels, cmap=custom_cmap, norm=norm) # 4. 添加色条,显示整数关键点刻度 cbar = fig.colorbar(cs, norm=norm, boundaries=bounds, ticks=bounds) cbar.set_label('Value') plt.show()
关键说明
LinearSegmentedColormap.from_list通过数值(归一化到[0,1])与颜色的对应关系,生成平滑过渡的自定义色图。BoundaryNorm确保每个整数边界附近的数据都能映射到目标颜色,中间区间自动完成颜色过渡。- 色条设置
ticks=bounds直接显示整数关键点,让颜色与数值的对应关系更直观。
内容的提问来源于stack exchange,提问作者Joshuah Heath
相关产品推荐
相关产品推荐

