根据Seaborn散点图中的列,允许标记颜色的阴影在一个类别内变化

时间:2020-10-30 21:30:08

标签: python seaborn scatter-plot color-shade

在Seaborn散点图中,有可能使用hue来标识类别,并使用特定列来定义标记大小,以允许标记颜色的“阴影”在一个类别内变化(定义为由hue)根据第三列?

以下示例使用hue来标识类别 (根据df['cat'])和df['p']来更改标记大小。但是,它不允许标记颜色的阴影在类别内(由hue定义)变化。我想使用df['q']来做到这一点。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set() 
    
df = pd.DataFrame({'x': np.random.normal(size=50),
                   'y': np.random.normal(size=50),
                   'cat': np.random.randint(1,4,size=50),
                   'p':  np.random.uniform(size=50),
                   'q': np.random.uniform(size=50)})
    
df.head()
    
fig, ax = plt.subplots(figsize=(8,8), tight_layout=True)
ax = sns.scatterplot(data = df, x='x',y='y', hue = 'cat', size='p')
plt.show()

1 个答案:

答案 0 :(得分:1)

最困难的部分是获得正确的调色板。您必须选择最亮和最暗的颜色与其他颜色足够不同的调色板,以区分它们。在这个示例中,我选择了cubehelix方法,但是您会遇到更多类别的麻烦。

您可能需要定义自己的一组调色板,并确保可以在色带上的任何位置将它们区分开。

这只会循环遍历每个类别,并在另一个类别上进行绘制,并随即更改配色方案。

plt.figure(figsize=(15,15))
sns.set_style("white")
edge_color = ['blue','brown','green']

for i, x in enumerate(df.cat.unique()):

    t = df[df['cat']==x]
    p = sns.cubehelix_palette(start=i, rot=0, dark=.1, light=.7, as_cmap=True)
    g = sns.scatterplot(data = t, x='x',y='y', hue = 'q', size='p', palette=p, legend=None, edgecolor=edge_color[i])
    
plt.legend(title='Category', loc='upper left', labels=df.cat.unique())
leg = g.get_legend()

leg.legendHandles[0].set_color('Blue')
leg.legendHandles[1].set_color('Brown')
leg.legendHandles[2].set_color('Green')

enter image description here