Seaborn: Comment ajouter une légende à Seaborn Barplot

Dec 12 2020

J'essaye d'ajouter une légende à mon seaborngraphique à 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

1 lys Dec 13 2020 at 07:06

Voici une seule ligne que vous pouvez utiliser dans votre code existant en définissant le paramètre handlesde 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")    
3 StupidWolf Dec 13 2020 at 06:54

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)