Seaborn: Comment ajouter une légende à Seaborn Barplot
J'essaye d'ajouter une légende à mon seaborn
graphique à barres. J'ai déjà essayé d'ajouter de la teinte mais une erreur apparaît, IndexingError: Unalignable boolean Series provided as indexer (index of the boolean Series and of the indexed object do not match).
alors j'ai essayé une autre solution en lui donnant le paramètre d'étiquettes. Voici le 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")
C'est le résultat, ce résultat est faux. Il est censé avoir l'étiquette Femme et Homme en fonction de leur couleur dans la barre. La femelle et le mâle sont censés être séparés avec des couleurs différentes. J'ai déjà essayé de suivre ceci , ceci et cela, mais aucun de ceux-ci ne fonctionne pour moi. Comment dois-je le faire?

Réponses
Voici une seule ligne que vous pouvez utiliser dans votre code existant en définissant le paramètre handles
de la légende:
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())]
Utilisez comme ceci:
plt.legend(handles=patches, loc="upper left")

Script complet:
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")
Je pense que vous compliquez trop les choses avec le groupby. Vous pouvez utiliser sns.countplot:
customer = pd.DataFrame({'gender':np.random.choice(["Male","Female"],100)})
sns.countplot(x='gender',hue='gender',data=customer,dodge=False)
