Seaborn:如何将图例添加到 Seaborn 的柱状图中。

4

我正在尝试为我的seaborn条形图添加图例。我已经尝试添加色调,但出现错误,显示IndexingError: Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match).因此,我尝试了其他解决方案,通过给它标签参数。以下是代码:

plt.figure(figsize=[15,12])                     
sns.barplot(x=customer['gender'].unique(),y=customer.groupby(['gender'])['gender'].count(),
            data=customer,label=customer['gender'].unique())
plt.legend(loc="upper left")

这是结果,但结果是错误的。根据条形图中的颜色,应该有“女性”和“男性”标签。女性和男性应该用不同的颜色分开。我已经尝试过this, thisthis,但都不起作用。我该怎么做?

plot

2个回答

5

如果要在现有代码中设置图例的handles参数,可以使用以下一行代码:

patches = [matplotlib.patches.Patch(color=sns.color_palette()[i], label=t) for i,t in enumerate(t.get_text() for t in plot.get_xticklabels())]

使用方式如下:

plt.legend(handles=patches, loc="upper left") 

plot

完整脚本:
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib
import pandas as pd
import numpy as np
import random

#generate random test data
genders = ['Male', 'Female']
sampling = random.choices(genders, k=100)
customer = pd.DataFrame({'gender': sampling})

#you can change the palette and it will still work
sns.set_palette("Accent")
                  
plot = sns.barplot(x=customer['gender'].unique(),y=customer.groupby(['gender'])['gender'].count(),
            data=customer) 

patches = [matplotlib.patches.Patch(color=sns.color_palette()[i], label=t) for i,t in enumerate(t.get_text() for t in plot.get_xticklabels())]
plt.legend(handles=patches, loc="upper left")    

4

我认为你在使用groupby时过于复杂了。你可以使用sns.countplot:

customer = pd.DataFrame({'gender':np.random.choice(["Male","Female"],100)})
sns.countplot(x='gender',hue='gender',data=customer,dodge=False)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接