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

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绑定整数边界,具体操作如下:

  1. 定义颜色关键点:
    按需求指定各整数点对应的目标颜色,同时保留过渡自然性:

    • -2 → 品红色 (magenta)
    • -1 → 蓝色 (blue)
    • 0 → 灰色 (gray)
    • 1 → 红色 (red)
    • 2 → 绿色 (green)
  2. 创建自定义颜色映射:
    使用matplotlib.colors.LinearSegmentedColormap将颜色关键点转换为可直接调用的色图。

  3. 调整边界与归一化:
    更新bounds为[-2, -1, 0, 1, 2],让BoundaryNorm依据这些整数边界划分颜色区间。

  4. 适配绘图与色条:
    调整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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 16:10:34