Seaborn:SeabornBarplotに凡例を追加する方法
Dec 12 2020
seaborn
棒グラフに凡例を追加しようとしています。すでに色相を追加しようとしましたが、エラーが表示されるIndexingError: Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match).
ので、labelsパラメーターを指定して他の解決策を試しました。これがコードです
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")
これは結果です、この結果は間違っています。バーの色に応じて、女性と男性のラベルが付いているはずです。女性と男性は異なる色で分けられることになっています。私はすでにこれ、これ、そしてこれに従おうとしましたが、それらのどれも私のために働きません。どうすればいいですか?

回答
1 lys Dec 13 2020 at 07:06
handles
凡例のパラメータを設定することで、既存のコードで使用できる1つのライナーを次に示します。
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")

完全なスクリプト:
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")
3 StupidWolf Dec 13 2020 at 06:54
私はあなたがgroupbyで物事を過度に複雑にしていると思います。sns.countplotを使用できます。
customer = pd.DataFrame({'gender':np.random.choice(["Male","Female"],100)})
sns.countplot(x='gender',hue='gender',data=customer,dodge=False)
