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

如何在Matplotlib中创建带指定区间的渐变颜色映射

解决Matplotlib非均匀值对应自定义颜色映射的问题

要实现为非均等分布的特定值指定颜色并保留平滑渐变,你可以通过归一化数值位置的方式使用LinearSegmentedColormap.from_list(),具体步骤如下:

1. 整理颜色与对应数值

首先确保你的颜色字典格式正确(补充分号),并按数值从小到大排序:

import matplotlib.pyplot as plt
from matplotlib.colors import LinearSegmentedColormap

# 修正格式后的颜色映射
colourA = {
    0.01: "#51158d",
    0.25: "#5c2489",
    0.5:  "#693584",
    1:    "#9d9933",
    3:    "#e3dc56"
}

# 按数值顺序排序键值对
sorted_pairs = sorted(colourA.items())
values, colors = zip(*sorted_pairs)

2. 归一化数值到[0,1]区间

LinearSegmentedColormap.from_list()接受的位置参数必须是0到1之间的归一化值,因此需要将你的原始数值映射到这个区间:

vmin = values[0]
vmax = values[-1]
# 计算每个数值对应的归一化位置
norm_positions = [(val - vmin) / (vmax - vmin) for val in values]

3. 创建自定义颜色映射

将归一化位置与对应颜色组成元组列表,传入from_list()生成颜色映射:

# 构建(归一化位置, 颜色)的列表
color_tuples = list(zip(norm_positions, colors))
custom_cmap = LinearSegmentedColormap.from_list("custom_colormap", color_tuples)

4. 测试颜色映射

使用测试数据验证效果,注意设置vmin和vmax确保颜色与你定义的数值完全对应:

import numpy as np

# 生成覆盖0.01到3范围的测试数据
test_data = np.linspace(vmin, vmax, 100).reshape(10, 10)

plt.imshow(test_data, cmap=custom_cmap, vmin=vmin, vmax=vmax)
plt.colorbar(label="Value")
plt.title("Custom Non-Uniform Colormap")
plt.show()

关键说明

  • 如果你的数据超出0.01-3的范围,Matplotlib会自动延伸两端的渐变;若要截断超出范围的颜色,可以使用plt.clim(vmin, vmax)。
  • 排序步骤很重要,确保颜色渐变的顺序与数值递增方向一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 01:55:32