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')
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:
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.
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"]);
Modifier:
Une ligne de moins:
df = pd.DataFrame({'A':26, 'B':20}, index=['N'])
ax = df.plot(kind='bar')
ax.legend(["AAA", "BBB"]);
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.
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:
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: