基于离散colorbar与离散colormesh实现矩阵规则配色的问题求解
解决方案
你遇到的问题核心是没有显式指定边界归一化规则,导致Matplotlib默认的全局线性归一逻辑没有正确识别大于30的极值,同时颜色映射表的配置存在冗余冲突。以下是修改后可完全符合需求的代码:
import numpy as np import matplotlib.pyplot as plt from matplotlib import colors Z_1 = 8 Z_2 = 20 Z_3 = 30 period = 5 size = 10 np.random.seed(1) my_matrix = np.random.randint(-4,50,[period,size]) my_matrix[0,0] = 33 my_matrix[1,0] = 31 print(" ") print(my_matrix.T) print(" ") # 核心修改部分 bounds = [-5,Z_1,Z_2,Z_3] # 仅保留3个基础区间对应的颜色,大于30的走极值配置 cmap = colors.ListedColormap(['white', 'black','red']).with_extremes(over='green') # 绑定边界归一规则,严格按照自定义区间做颜色映射 norm = colors.BoundaryNorm(bounds, cmap.N) pm=plt.pcolormesh(my_matrix.T, cmap = cmap, norm=norm) plt.colorbar(pm, boundaries = bounds ,extend = 'max', extendfrac='auto' ,ticks=bounds) for i in range(len(my_matrix[:,0])): for j in range(len(my_matrix[0,:])): plt.text(i,j,str(my_matrix[i,j]), va='center_baseline', ha='left',color = 'blue') plt.gca().invert_yaxis() plt.show()
修改说明
- 新增
BoundaryNorm对象后,会严格按照你定义的bounds区间做数值到颜色的映射,大于30的数值会被自动识别为极值,触发with_extremes定义的over绿色配置,测试值33、31会正确显示为绿色。 - 移除了
ListedColormap中冗余的第四个绿色参数,避免和over极值配置的绿色冲突,所有区间的配色规则都会严格生效,colorbar也会完整显示四个对应色阶和max扩展段。 - 如果你需要调整边界值(等于8、20、30的数值)的归属规则,可以修改
BoundaryNorm的clip、extend参数适配需求。
内容的提问来源于stack exchange,提问作者Siderius
相关产品推荐
相关产品推荐

