matplotlib 中的标准化颜色映射到底发生了什么?

What exactly is happening under the hood in Normalized colour mapping in matlpotlib?

我必须在 matplotlib 中制作 4 种不同分布均值的条形图,其中条形图的颜色会根据给定的 Y(平均值)值交互变化。我使用 1.96 作为 95% 的置信区间。

stderr = df.std(axis=1)/np.sqrt(n)
norm = Normalize(vmin=-1.96,vmax=1.96)
cmap = get_cmap('PuOr')
Z = (mean.values -y)/stderr.values
normed = norm(Z)

这可确保代码按预期工作。我想知道的是当 Z:

中的值时到底发生了什么
array([-1.11052123,  2.98511452,  1.0731187 ,  9.30156312])

正在映射到规范中的值:

masked_array(data=[0.21670377, 1.26150881, 0.77375477, 2.87284774],
         mask=False,
   fill_value=1e+20)

它究竟是如何映射的?我通过阅读文档知道这些值被映射到区间 -1.96 到 1.96。我想知道的是 9.30 是如何映射到 2.87 的。

在这种情况下,范数只是将 vmin 映射到 0 并将 vmax 映射到 1 的线性变换。该范围之外的值通过相同的线性变换进行映射。

计算颜色时,cmap的输入值被认为是介于0和1之间。如果遇到大于1的值,则简单地映射到最高颜色。

下面是一些代码和图表来说明行为:

from matplotlib import pyplot as plt
import numpy as np

norm = plt.Normalize(vmin=-1.96, vmax=1.96)
Z = np.array([-1.11052123, 2.98511452, 1.0731187, 9.30156312])
zs = np.linspace(-3, 10, 50)

plt.imshow(np.linspace(-0.3, 3.2, 200).reshape(-1, 1), extent=[-3, -2.8, -0.3, 3.2], origin='lower',
           cmap='PuOr', vmin=0, vmax=1, aspect='auto')
plt.scatter(zs, norm(zs), c=zs, norm=norm, cmap='PuOr')
plt.vlines(Z, -2, norm(Z), color='crimson', ls='--')
plt.hlines(norm(Z), -3, Z, color='crimson', ls='--')
plt.vlines([-1.96, 1.96], -2, [norm(-1.96), norm(1.96)], color='dodgerblue', ls='--')
plt.hlines([0, 1], -3, [-1.96, 1.96],  color='dodgerblue', ls='--')
plt.ylim(ymin=-0.3)
plt.margins(x=0, tight=True)
plt.xlabel('Z', size=16)
plt.ylabel('norm(Z)', size=16)
plt.show()