在 seaborn 散点图中分配不同的标记、大小、边界和不透明度 [英] Assign different markers, size, borders and opacity in seaborn scatterplot
问题描述
我有以下数据框
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屋!