Seaborn: Bagaimana menambahkan legenda ke seaborn barplot
Saya mencoba menambahkan legenda ke seaborn
plot bar saya . Saya sudah mencoba menambahkan hue tetapi muncul kesalahan yang mengatakan IndexingError: Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match).
jadi saya mencoba solusi lain dengan memberinya parameter label. Ini kodenya
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")
Ini akibatnya, hasil ini salah. Seharusnya ada label Wanita dan Pria sesuai dengan warna mereka di bilah. Wanita dan Pria seharusnya dipisahkan dengan warna yang berbeda. Saya sudah mencoba mengikuti ini , ini , dan ini tetapi tidak ada yang berhasil untuk saya. Bagaimana saya harus melakukannya?

Jawaban
Berikut ini satu liner yang dapat Anda gunakan dalam kode yang ada dengan menyetel handles
parameter untuk legenda:
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())]
Gunakan seperti ini:
plt.legend(handles=patches, loc="upper left")

Skrip lengkap:
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")
Saya pikir Anda terlalu memperumit masalah dengan groupby. Anda dapat menggunakan sns.countplot:
customer = pd.DataFrame({'gender':np.random.choice(["Male","Female"],100)})
sns.countplot(x='gender',hue='gender',data=customer,dodge=False)
