如何将值映射到 seaborn swarmplot 中的范围?

How to map values on to a range in seaborn swarmplot?

我有一个范围为 [0, 1] 的包含 100 个浮点值的数组。 (最小值和最大值不一定是 0 和 1)

我想在群图中将它们映射到“icefire”调色板中的色调。换句话说,我希望数据点、点具有基于 100-val-array 的色调。

现在,我不希望将最低值映射到调色板中“最低”的颜色;我希望将最低值映射到调色板中的“相应”颜色。

让我们假设调色板也从 [0, 1] 开始,所以在“icefire”的情况下,0 是浅蓝色,1 是浅红色(icefire 从浅蓝色变为黑色中间,浅红色)。

考虑到这一点,如果 100-val-array 中的最小值是 0.27,那么我希望该值映射到颜色 0.27,即在 icefire 的情况下,在蓝色的某个地方。

我希望我说清楚了。

我不知道 swarmplot 中的“palette”参数是如何工作的,但它不是我想要的。

我需要这个的原因是数据点的颜色很重要,因为它反映了 100-val 数组中的实际值。

我相信仅使用 swarmplot(..., palette="icefire") 不会发生这种情况。

与散点图不同,Seaborn 的 swarmplot(目前?)不使用 vmin=vmax= 参数。 swarmplot 将色调映射视为分类映射。您可以通过创建一个 palette 作为将每个可能的 hue 值映射到其对应颜色的字典来模拟使用颜色图。

您的示例可能如下所示:

import matplotlib.pyplot as plt
from matplotlib.cm import ScalarMappable
import seaborn as sns
import pandas as pd
import numpy as np

df = pd.DataFrame({'x': ['swarm 1'] * 100,
                   'y': np.random.normal(size=100),
                   'hue': np.random.uniform(0.27, 0.9, 100)})
cmap = sns.color_palette('icefire', as_cmap=True)
norm = plt.Normalize(vmin=0, vmax=1)  # 0 and 1 are the defaults, but you can adapt these to fit other uses
palette = {h: cmap(norm(h)) for h in df['hue']}

ax = sns.swarmplot(data=df, x='x', y='y', hue='hue', palette=palette)
ax.legend_.remove()  # remove the categorical legend
plt.colorbar(ScalarMappable(cmap=cmap, norm=norm), ax=ax)  # optionally add a colorbar
plt.show()