Seaborn: Jak dodać legendę do wykresu słupkowego z morskim

Dec 12 2020

Próbuję dodać legendę do mojego seabornwykresu słupkowego. Próbowałem już dodać odcień, ale wyskakuje błąd z informacją, IndexingError: Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match).więc wypróbowałem inne rozwiązanie, podając mu parametr etykiet. Oto kod

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")

To jest wynik, ten wynik jest błędny. Powinien mieć etykietę Kobieta i Mężczyzna zgodnie z ich kolorem na pasku. Kobieta i mężczyzna mają być rozdzielone różnymi kolorami. Próbowałem już śledzić to , to i to, ale żadna z nich nie działa dla mnie. Jak mam to zrobić?

Odpowiedzi

1 lys Dec 13 2020 at 07:06

Oto jedna linijka, której możesz użyć w istniejącym kodzie, ustawiając handlesparametr dla legendy:

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())]

Użyj w ten sposób:

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

Pełny skrypt:

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

Myślę, że zbytnio komplikujesz sprawy z grupą. Możesz użyć sns.countplot:

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