Python Seaborn色调和尺寸图例

Python Seaborn色调和尺寸图例,python,matplotlib,seaborn,legend,Python,Matplotlib,Seaborn,Legend,我正试图改变Seaborn创造的一个情节传说中的垃圾箱。数据范围为0至100,而Seaborn垃圾箱范围为1至120和0至80。我试过使用hue\u norm和size\u norm,但没有效果 请参见下面的代码和所附图片: import matplotlib.pyplot as plt import seaborn as sns from import_portfolio import df, portfolio import numpy as np from adjustText impor

我正试图改变Seaborn创造的一个情节传说中的垃圾箱。数据范围为0至100,而Seaborn垃圾箱范围为1至120和0至80。我试过使用
hue\u norm
size\u norm
,但没有效果

请参见下面的代码和所附图片:

import matplotlib.pyplot as plt
import seaborn as sns
from import_portfolio import df, portfolio
import numpy as np
from adjustText import adjust_text

df_factor = df[df.columns[df.columns.str.contains('Factor Percentile')]]

columns = []
for column in df_factor.columns:
    split = str.split(column, sep=' ')
    fac = split[split.index('Factor') - 1]
    columns.append(fac)

df_factor.columns = columns
df_factor['Symbol'] = df['Symbol'].copy()
df_factor = df_factor.replace(' ', np.NaN)

plt.figure(figsize=(13,7))
ax = sns.scatterplot(data=df_factor.dropna(), x='Valuation', y='Quality', hue='Momentum', size='Growth', palette='RdYlGn', sizes=(20,150))
plt.xlim(0,100)
plt.ylim(0,100)

adjust_text(texts, arrowprops=dict(arrowstyle='-', color='k', lw=0.5))

plt.legend(bbox_to_anchor=(1.05,1), loc=2, borderaxespad=0.)
图片:

有人知道如何解决这个问题吗


谢谢

您可以更改图例,但由于您使用的是data.frame和seaborn,一个选项是首先将您的
色调
大小
分类,并为
sns.scatterplot提供匹配的标签或颜色

例如:

将matplotlib.pyplot作为plt导入 导入seaborn作为sns 将numpy作为np导入

np.随机种子(999) df_factor=pd.DataFrame(np.random.uniform(0100,(20,4)),列=[“估值”,“质量”,“增长”,“动量])

这里我们介绍另一列,将这两列离散化。您也可以覆盖它或使用函数。下面我使用pd.cut指定0到20(包括20)之间的值,以获得标签20,21-40以获得标签40,依此类推:

df_factor['Growth_lvl'] = pd.cut(df_factor['Growth'],[0,20,40,60,80,100],labels=[20,40,60,80,100])
df_factor['Momentum_lvl'] = pd.cut(df_factor['Momentum'],[0,20,40,60,80,100],labels=[20,40,60,80,100])

plt.figure(figsize=(13,7))
ax = sns.scatterplot(data=df_factor.dropna(), x='Valuation', y='Quality', hue='Momentum_lvl', 
                     size ='Growth_lvl', palette='RdYlGn',
                     sizes = list(np.arange(10,100,20)),
                     hue_order= [20,40,60,80,100])
plt.xlim(0,100)
plt.ylim(0,100)

plt.legend(bbox_to_anchor=(1.05,1), loc=2, borderaxespad=0.)