web-dev-qa-db-fra.com

Modifier la légende du complot à barres des pandas

Je suis toujours dérangé quand je fais un bar complot avec des pandas et je veux changer les noms des étiquettes dans la légende. Considérons par exemple la sortie de ce code:

import pandas as pd
from matplotlib.pyplot import *

df = pd.DataFrame({'A':26, 'B':20}, index=['N'])
df.plot(kind='bar')

 enter image description here Maintenant, si je veux changer le nom dans la légende, j'essayerais habituellement de faire:

legend(['AAA', 'BBB'])

Mais je me retrouve avec ceci:

 enter image description here

En fait, la première ligne en pointillé semble correspondre à un patch supplémentaire. 

Je me demande donc s'il existe un truc simple pour changer les étiquettes ou si je dois tracer chacune des colonnes indépendamment avec matplotlib et définir les étiquettes moi-même. Merci.

23
Benares

Modification des étiquettes pour les pandas df.plot():

import pandas as pd
from matplotlib.pyplot import *

fig, ax = subplots()
df = pd.DataFrame({'A':26, 'B':20}, index=['N'])
df.plot(kind='bar', ax=ax)
ax.legend(["AAA", "BBB"]);

 enter image description here

Modifier:

Une ligne de moins:

df = pd.DataFrame({'A':26, 'B':20}, index=['N'])
ax = df.plot(kind='bar')
ax.legend(["AAA", "BBB"]);

 enter image description here

35
Sergey Bushmanov

Si vous devez appeler plusieurs fois l'intrigue, vous pouvez également utiliser l'argument "label":

ax = df1.plot(label='df1')
ax = df2.plot(label='df2')

Bien que ce ne soit pas le cas dans la question OP, cela peut être utile si DataFrame est au format long et que vous utilisez groupby avant de tracer.

0
Jonathan

C'est un peu un cas Edge, mais je pense que cela peut ajouter de la valeur aux autres réponses. 

Si vous ajoutez plus de détails au graphique (une annotation ou une ligne, par exemple), vous vous rendrez vite compte de sa pertinence lorsque vous appelez la légende sur l’axe: si vous l’appelez au bas du script, des poignées différentes seront capturées pour la éléments de légende, tout déconner.

Par exemple le script suivant:

df = pd.DataFrame({'A':26, 'B':20}, index=['N'])
ax = df.plot(kind='bar')
ax.hlines(23, -.5,.5, linestyles='dashed')
ax.annotate('average',(-0.4,23.5))

ax.legend(["AAA", "BBB"]); #quickfix: move this at the third line

Vous donnera ce chiffre, qui est faux:  enter image description here

Bien qu'il s'agisse d'un exemple jouet qui peut être facilement corrigé en modifiant l'ordre des commandes, vous devrez parfois modifier la légende après plusieurs opérations. La méthode suivante vous donnera donc plus de souplesse. Ici, par exemple, j'ai également changé la taille de la police et la position de la légende:

df = pd.DataFrame({'A':26, 'B':20}, index=['N'])
ax = df.plot(kind='bar')
ax.hlines(23, -.5,.5, linestyles='dashed')
ax.annotate('average',(-0.4,23.5))
ax.legend(["AAA", "BBB"]);

# do potentially more stuff here

h,l = ax.get_legend_handles_labels()
ax.legend(h[:2],["AAA", "BBB"], loc=3, fontsize=12)

Voici ce que vous obtiendrez:

 enter image description here

0
gibbone