如何根据条件为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
相关产品推荐
相关产品推荐

