在 seaborn 散点图中分配不同的标记、大小、边界和不透明度 [英] Assign different markers, size, borders and opacity in seaborn scatterplot

查看:32
本文介绍了在 seaborn 散点图中分配不同的标记、大小、边界和不透明度的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下数据框

   xvalue, A   B   C   D
0  10, aa  mn  cd  kk
1  20, ab  cd  wc  ll
2  30, wc  cd  mn  sf
3  40, ll  ll  kk  mn
4  50, wc  kk  mn  cd
5  60, aa  ll  we  sf
6  70, ss  aa  ss  kk

创建它的代码

options = ["ab", "cd", "bb", "aa", "we", "ss", "kk", "mn", "re", "wc", "ll", "sf"]
df = pd.DataFrame(columns=["A", "B", "C", "D"])
for i, it in enumerate([1,2,3,4,5,6,7]):
    row = [10*i, random.sample(options, 1)[0], random.sample(options, 1)[0], 
           random.sample(options, 1)[0], random.sample(options, 1)[0]]
    df.loc[i] = row

绘制完成

s = df.melt(id_vars='xvalue', 
            value_vars=['A','B','C','D'],
            value_name='value',
            var_name='column')
s['value'] = pd.Categorical(s['value'], categories=options, ordered=True)

sns.scatterplot(data=s.sort_values('value'), x='xvalue', y='value', hue='column')

现在的问题 - 我如何为属于不同类(由列定义,例如 A、B、C、D)的散点分配不同的样式.例如,我希望类 A 是标记P",B 是标记p",C 是标记v".同样我想定义 alpha(不透明度)、边界线、指定颜色等.

Now the question -- how do I assign different styles to scatter-dots that belong to different classes (defined by columns, e.g A, B, C, D). FOr example I want class A to be marker "P", B to be marker "p", C to be marker "v". Same I want to define alpha (opacity), border line, specify color etc.

在matplotlib中,我会做

In matplotlib I would do

plt.scatter(x, y, color="blue", label="A", alpha=0.8, s=80, marker="p")

但这会在具有自己的参数的图形上明确创建不同的图.现在,我不知道如何处理一个图"中的不同类别.

But that would explicitly create a different plot on a graph with its own params. Right now I don't know how to deal with different classes within "one plot".

我也试过

markers = {"A": "s", "B": "X", "C": "p", "D":"o"}
sns.scatterplot(data=s.sort_values('value'), x='xvalue', y='value', hue='column', markers=markers)

但是没有效果.

为了应用不同的标记,我应该指定 style="column",但如果我尝试

in order to apply different markers I should specify style="column", but if I try

sizes = {"A":100, "B": 120, "C": 150, "D":200}
sns.scatterplot(data=s.sort_values('value'), x='xvalue', y='value', hue='column', markers=markers, s=sizes)

它不起作用

推荐答案

另一种方法是将 options 中的字符串/值替换为枚举:

Another way is to replace the strings/values in options with the enumeration:

opt_dict = {opt:i for i,opt in enumerate(options)}

markers = {"A": "s", "B": "X", "C": "p", "D":"o"}
sizes = {"A":100, "B": 120, "C": 150, "D":200}
alphas = {'A':0.2, 'B':0.3, 'C':0.6, 'D':0.8}
col_list = ['A','B','C','D']

fig, ax = plt.subplots(figsize=(9,6))
for col in col_list:
    ax.scatter(df['xvalue'], df[col].map(opt_dict), 
               marker=markers[col],
               s=sizes[col],
               alpha=alphas[col],
               label=col)
    
ax.set_yticks(range(len(options)))
ax.set_yticklabels(options)
ax.legend()

输出:

这篇关于在 seaborn 散点图中分配不同的标记、大小、边界和不透明度的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆