leroygr leroygr - 4 months ago 55
Python Question

Annotate bars with values on Pandas bar plots

I looking for a way to annotate my bars in a Pandas bar plot with the values (rounded) in my DataFrame.

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

I would like to get something like this:

bar plot annotation example

I tried with this, but the annotations are all centered on the xthicks:

>>> 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)
(idx, value),
xytext=(0, 15),
textcoords='offset points')


You get it directly from the axes' patches:

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

You'll want to tweak the string formatting and the offsets to get things centered, maybe use the width from p.get_width(), but that should get you started. May not worked with stacked barplots unless you track the offsets somewhere.