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