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

基于离散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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 01:06:04