Seaborn: So fügen Sie dem Seaborn Barplot eine Legende hinzu

Dec 12 2020

Ich versuche, meinem seabornBalkendiagramm eine Legende hinzuzufügen . Ich habe bereits versucht, einen Farbton hinzuzufügen, aber es wird ein Fehler angezeigt, der besagt, IndexingError: Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match).dass ich eine andere Lösung ausprobiert habe, indem ich ihm den Label-Parameter gegeben habe. Hier ist der Code

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

Dies ist das Ergebnis, dieses Ergebnis ist falsch. Es soll das Etikett "Weiblich" und "Männlich" entsprechend ihrer Farbe in der Leiste haben. Das Weibchen und das Männchen sollen mit unterschiedlichen Farben getrennt werden. Ich habe bereits versucht, diesem , diesem und jenem zu folgen , aber keines davon funktioniert für mich. Wie soll ich das machen

Antworten

1 lys Dec 13 2020 at 07:06

Hier ist ein handlesEinzeiler, den Sie in Ihrem vorhandenen Code verwenden können, indem Sie den Parameter für die Legende festlegen:

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

Verwenden Sie wie folgt:

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

Vollständiges Skript:

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

Ich denke, Sie machen die Sache mit der Gruppe zu kompliziert. Sie können sns.countplot verwenden:

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