Seaborn: Bagaimana menambahkan legenda ke seaborn barplot

Dec 12 2020

Saya mencoba menambahkan legenda ke seabornplot 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

1 lys Dec 13 2020 at 07:06

Berikut ini satu liner yang dapat Anda gunakan dalam kode yang ada dengan menyetel handlesparameter 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")    
3 StupidWolf Dec 13 2020 at 06:54

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)