如何在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
相关产品推荐
相关产品推荐

