web-dev-qa-db-fra.com

Annoter les barres avec des valeurs sur Pandas tracés à barres

Je cherchais un moyen d'annoter mes barres dans un graphique à barres Pandas) avec les valeurs numériques arrondies de mon DataFrame.

>>> df=pd.DataFrame({'A':np.random.Rand(2),'B':np.random.Rand(2)},index=['value1','value2'] )         
>>> df
                 A         B
  value1  0.440922  0.911800
  value2  0.588242  0.797366

J'aimerais avoir quelque chose comme ça:

bar plot annotation example

J'ai essayé avec cet exemple de code, mais les annotations sont toutes centrées sur les ticks x:

>>> ax = df.plot(kind='bar') 
>>> for idx, label in enumerate(list(df.index)): 
        for acc in df.columns:
            value = np.round(df.ix[idx][acc],decimals=2)
            ax.annotate(value,
                        (idx, value),
                         xytext=(0, 15), 
                         textcoords='offset points')
56
leroygr

Vous l'obtenez directement depuis les patchs des axes:

In [35]: for p in ax.patches:
    ax.annotate(str(p.get_height()), (p.get_x() * 1.005, p.get_height() * 1.005))

Vous voudrez peut-être ajuster la mise en forme de la chaîne et les décalages pour centrer les choses, peut-être utiliser la largeur de p.get_width(), mais cela devrait vous aider à démarrer. Cela peut ne pas fonctionner avec les graphiques en barres empilées à moins que vous ne suiviez les décalages quelque part.

90
TomAugspurger

Solution qui gère également les valeurs négatives avec un exemple de formatage flottant.

Il faut encore peaufiner les décalages.

df=pd.DataFrame({'A':np.random.Rand(2)-1,'B':np.random.Rand(2)},index=['val1','val2'] )
ax = df.plot(kind='bar', color=['r','b']) 
x_offset = -0.03
y_offset = 0.02
for p in ax.patches:
    b = p.get_bbox()
    val = "{:+.2f}".format(b.y1 + b.y0)        
    ax.annotate(val, ((b.x0 + b.x1)/2 + x_offset, b.y1 + y_offset))

value labeled bar plot

23
tworec