【问题标题】:How to add legend to seaborn.scatterplot?如何将图例添加到 seaborn.scatterplot?
【发布时间】:2022-01-23 06:09:00
【问题描述】:

我有一个包含多列的数据框。我试图在另外两个因素的散点图中添加一个关于性的图例(无色调)。我试图将图例参数传递给 sns.scatterplot() 并由 ax.legend(handles,labels) 手动设置。但是,第一种方法未能显示图例,第二种方法引发 ValueError。
这是我当前的代码

    bar=sns.barplot(x=df.loc[:,'Sex'],y=df.loc[:,'Salary'],ax=ax[0])
    bar.set(ylim=(10000,30000))
    sca=sns.scatterplot(data=df,x=df.loc[:,'yearsinrank'],y=df.loc[:,'Salary'],ax=ax[1])
    sca.legend(handles=df.loc[:,'Sex'],labels=['male','female'])
    sca.set(ylim=(10000,40000),xlim=(-5,30))
    plt.show()

这是示例输出

非常感谢!

【问题讨论】:

  • 你使用的是 ax.legend 还是 ax[1].legend?为了澄清这种歧义,也许您可​​以在代码中添加代码(作为注释行)。
  • @SimonHawe 是的。但还是一样的 ValueError:一个系列的真值是模棱两可的。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。
  • 但是图例应该显示什么?您的代码生成一种类型的标记,但您有两个条目。这张地图如何?您的示例输出也与您的代码所暗示的不同。
  • @Mr.T 我已经在 ax[0] 上实现了第一个子图。对于第二个散点图,我有一个包含许多列的数据库。散点图显示了薪水和年限的关系,点和图例的颜色应该代表每个点的性别
  • 那么,this answer 建议使用 hue 关键字究竟有什么问题。使用随机数据集按预期工作。我建议还显示在散点图中生成两种类型标记的代码。当前代码没有。

标签: python pandas matplotlib seaborn


【解决方案1】:

您可以通过添加 hue 参数来实现。

fig, ax = plt.subplots(1, 2, figsize=(16, 5))

bar = sns.barplot(
    x=df.loc[:, 'Sex'],
    y=df.loc[:, 'Salary'],
    ax=ax[0]
)
bar.set(ylim=(10000, 30000))
sca = sns.scatterplot(
    data=df,
    x=df.loc[:, 'yearsinrank'],
    y=df.loc[:, 'Salary'],
    hue=df.loc[:, 'Sex'], # hue argument to specify grouping variable
    ax=ax[1]
)
sca.set(ylim=(10000, 40000), xlim=(-5, 30))
plt.show() 

【讨论】:

  • 我明白了。我可以做色调,但我不能做传奇
【解决方案2】:

散点图返回一个坐标区对象。

因此,您可以使用第四种方法来标记axes object:标记现有地块(尽管不鼓励这样做)。您可以使用:

sca.legend(['male','female')

ax[1].legend(['male','female')

【讨论】:

  • 我已经尝试过了,但是图例显示所有点都是男性,这就是为什么我将句柄参数传递给 ax.legend()
【解决方案3】:

所以我通过使用hue属性和legend setter方法解决了这个问题。 (似乎色调和图例之间有某种关系?) 这是我当前的代码

f,ax = plt.subplots(nrows=1,ncols=2,sharex=False,sharey=False)
bar=sns.barplot(x=df.loc[:,'Sex'],y=df.loc[:,'Salary'],ax=ax[0])
bar.set(ylim=(10000,30000))
sca=sns.scatterplot(data=df,x=df.loc[:,'yearsinrank'],y=df.loc[:,'Salary'],ax=ax[1],hue=df.loc[:,'Sex'])
sca.legend(loc='lower right')
sca.set(ylim=(10000,40000),xlim=(-5,30))
plt.show()

这是最终的结果

【讨论】:

    猜你喜欢
    • 2021-01-06
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多