簡體   English   中英

如何將值映射到seaborn swarmplot中的范圍?

[英]How to map values on to a range in seaborn swarmplot?

我在 [0, 1] 范圍內有一個包含 100 個浮點值的數組。 (最小值和最大值不一定是 0 和 1)

我想在 swarmplot 中將它們映射到“icefire”調色板中的色調。 換句話說,我希望數據點(點)具有基於 100-val-array 的色調。

現在,我不希望將最低值映射到調色板中的“最低”顏色; 我希望最低值映射到調色板中的“相應”顏色。

讓我們想象一下調色板也只是從 [0, 1] 開始,所以在“冰火”的情況下,0 是淺藍色,1 是淺紅色(冰火從淺藍色到中間的黑色,再到淺紅色)。

考慮到這一點,如果 100-val-array 中的最小值是 0.27,那么我希望該值映射到顏色 0.27,即在冰火的情況下,在藍色的某個地方。

我希望我清楚自己。

我不知道 swarmplot 中的“調色板”參數是如何工作的,但它並沒有做我想要的。

我需要這個的原因是因為數據點的顏色很重要,因為它反映了 100-val-array 中的實際值。

我相信僅使用 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()

具有顏色映射色調的 swarmplot

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM