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()
我必须在 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()