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

如何根据条件为NumPy二维数组分别应用绿、红色系cmap实现梯度着色

实现方案

你可以通过Matplotlib的TwoSlopeNorm自定义归一化规则+拼接双色colormap实现需求,完整代码如下:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import TwoSlopeNorm, LinearSegmentedColormap

# 你的示例数组
arr = np.array([0.1,0.15,0.2,0.5,0.7,
                -0.1,-0.12,0.23,0.4,0.8,
                -0.01,-.15,-0.1,0.2,0.5]).reshape(5,3)

# 1. 拼接自定义colormap:小于0为绿色渐变,大于0为红色渐变
# 反转Greens色板,保证数值越小(负的越多)绿色越深
green_part = plt.get_cmap('Greens_r')(np.linspace(0, 1, 128))
red_part = plt.get_cmap('Reds')(np.linspace(0, 1, 128))
custom_cmap = LinearSegmentedColormap.from_list('green_red_split', np.vstack([green_part, red_part]))

# 2. 自定义归一化规则,强制0为两个色系的分界点
norm = TwoSlopeNorm(vmin=-0.5, vcenter=0, vmax=1.5)

# 3. 渲染图像
plt.imshow(arr, cmap=custom_cmap, norm=norm)
plt.colorbar()
plt.show()

可选方案:掩码分层渲染

如果需要单独调整正负区间的色阶参数,也可以用掩码把正负数值分开绘制:

# 绘制正数部分:红色系
pos_mask = arr > 0
plt.imshow(np.ma.masked_where(~pos_mask, arr), cmap='Reds', vmin=0, vmax=1.5)
# 绘制负数部分:绿色系
neg_mask = arr < 0
plt.imshow(np.ma.masked_where(~neg_mask, arr), cmap='Greens_r', vmin=-0.5, vmax=0)

plt.colorbar()
plt.show()

参数调整说明

  • 绿色系可以替换为YlGn_r、BuGn_r等其他绿色系cmap,红色系可以替换为OrRd、YlOrRd等其他红色系cmap调整视觉效果
  • 如果你需要0值显示为白色,只需要在拼接cmap的时候,在绿色和红色部分中间插入白色的色值即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 00:12:01