web-dev-qa-db-fra.com

Terrain à barres Matplotlib Ajouter une légende à partir de catégories Colonne de DataFrame

J'essaie d'ajouter la légende qui devrait, selon mon exemple, la sortie:

  1. une place rouge avec le mot fruit et
  2. une place verte avec le mot veggie.

J'ai essayé plusieurs choses (l'exemple ci-dessous est que 1 des nombreux procès), mais je ne peux pas le faire fonctionner.

Quelqu'un peut-il me dire comment résoudre ce problème?

import pandas as pd
from matplotlib import pyplot as plt
data = [['Apple', 'fruit', 10], ['nanaba', 'fruit', 15], ['salat','veggie', 144]] 
data = pd.DataFrame(data, columns = ['Object', 'Type', 'Value']) 

colors = {'fruit':'red', 'veggie':'green'}           
c = data['Type'].apply(lambda x: colors[x])

bars = plt.bar(data['Object'], data['Value'], color=c, label=colors)
plt.legend()

plot

10
S12000

C'est donc une solution hacky et je suis sûr qu'il y a probablement de meilleures façons de le faire. Ce que vous pouvez faire est de parcourir les parcelles de barre individuelles qui sont invisibles à l'aide de width=0 Avec les couleurs de la parcelle d'origine et spécifiez les étiquettes. Vous devrez cependant faire cela dans un sous-champ.

import pandas as pd
from matplotlib import pyplot as plt

data = [['Apple', 'fruit', 10], ['nanaba', 'fruit', 15], ['salat','veggie', 144]] 
data = pd.DataFrame(data, columns = ['Object', 'Type', 'Value']) 


colors = {'fruit':'red', 'veggie':'green'}
c = data['Type'].apply(lambda x: colors[x])


ax = plt.subplot(111) #specify a subplot

bars = ax.bar(data['Object'], data['Value'], color=c) #Plot data on subplot axis

for i, j in colors.items(): #Loop over color dictionary
    ax.bar(data['Object'], data['Value'],width=0,color=j,label=i) #Plot invisible bar graph but have the legends specified

ax.legend()

plt.show()

enter image description here

1
BenT