如何在matplotlib的contourf中实现特定数值与固定颜色的一致映射?
解决方法
核心是自定义离散颜色映射与归一化规则,无需在数据中覆盖所有目标数值即可固定数值与颜色的对应关系,适配任意形状的数值区域。
修改后完整可运行代码
import numpy as np from matplotlib import pyplot as plt from matplotlib.colors import ListedColormap, BoundaryNorm # 1. 自定义颜色与数值对应规则:0→绿色、1→蓝色、2→红色 color_list = ['green', 'blue', 'red'] # 数值区间边界,对应0在(-0.5,0.5]、1在(0.5,1.5]、2在(1.5,2.5] value_bins = [-0.5, 0.5, 1.5, 2.5] # 生成自定义色卡与归一化规则 custom_cmap = ListedColormap(color_list) custom_norm = BoundaryNorm(value_bins, ncolors=custom_cmap.N) grid_x = np.linspace(-5, 5, 500) grid_y = np.linspace(-5, 5, 500) xx, yy = np.meshgrid(grid_x, grid_y) fig, ax = plt.subplots(2) rand1 = np.ones((500,500)) rand1[:, 250:] = 2 # 绘图时指定自定义cmap、norm和levels ax[0].contourf(xx, yy, rand1, levels=value_bins, alpha=.3, cmap=custom_cmap, norm=custom_norm) rand2 = np.zeros((500,500)) rand2[:, 200:250] = 1 rand2[:,250:] = 2 ax[1].contourf(xx, yy, rand2, levels=value_bins, alpha=.3, cmap=custom_cmap, norm=custom_norm) plt.show()
方案说明
ListedColormap用于定义离散的颜色序列,顺序和你需要的数值顺序一一对应BoundaryNorm用于建立数值区间到色卡位置的固定映射,不会随输入数据的最值变化而改变- 绘图时传入与边界匹配的
levels参数,确保contourf的渲染区间和归一化规则完全对齐 - 该方案不要求单张图的数据覆盖所有目标数值,也不限制数值区域的形状,只要数值在你定义的区间内,颜色对应关系就会保持统一。
内容的提问来源于stack exchange,提问作者punypaw
相关产品推荐
相关产品推荐

