plotting - plot histogram dataframe python
Anotar barras con valores en parcelas de barras Pandas (2)
Estoy buscando una forma de anotar mis barras en un diagrama de barra Pandas con los valores (redondeados) en mi 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
Me gustaría obtener algo como esto:
Intenté con esto, pero las anotaciones están todas centradas en los 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)
ax.annotate(value,
(idx, value),
xytext=(0, 15),
textcoords=''offset points'')
Lo obtiene directamente de los parches de los ejes:
In [35]: for p in ax.patches:
ax.annotate(str(p.get_height()), (p.get_x() * 1.005, p.get_height() * 1.005))
Deberá ajustar el formato de cadena y los desplazamientos para centrar las cosas, tal vez usar el ancho de p.get_width()
, pero eso debería p.get_width()
a comenzar. Puede que no funcione con barras de barras apiladas a menos que rastree los desplazamientos en algún lugar.
Solución que maneja también valores negativos con formato flotador de muestra.
Todavía necesita ajustar las compensaciones.
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))