вот один из способов сделать это:
ax=df.plot(kind='bar', stacked=True)
#loop to add the text
list_values = (dffinal['numPatients6month'].tolist()[::3]
+ dffinal['numPatients6month'].tolist()[1::3]
+ dffinal['numPatients6month'].tolist()[2::3])
for rect, value in zip(ax.patches, list_values):
h = rect.get_height() /2.
w = rect.get_width() /2.
x, y = rect.get_xy()
ax.text(x+w, y+h,value,horizontalalignment='center',verticalalignment='center')
#same than your code
plt.xticks(range(0,10), ['6month','1 year','1.5 year','2 year','2.5 year','3 year','3.5 year','4 year','4.5 year','5 year'], fontsize=8, rotation=45)
plt.title('Cognitive Impairement-Stack bar')
plt.show()
list_values
- получить значение из столбца 'numPatients6month' в том же порядке, что и rect
из ax.patches
, и в результате:
но из-за того, что некоторые столбцы маленькие, результаты не так легко прочитать.
РЕДАКТИРОВАТЬ: о цикле, ax.patches
содержит информацию обо всех барах, которые вы строите, поэтому для каждого бара, который я назвал rect
, с помощью get_xy
вы получаете позицию левого нижнего угла бара, и с помощью get_height
(r. get_width
) получите высоту (r. width) стержня. поэтому (x + w, y + h) дает координаты середины бара, куда вы добавляете текст value
(из list_values
) с помощью функции ax.text
(параметры horizontalalignment
и verticalalignment
имеют вид для центрирования текста)
РЕДАКТИРОВАТЬ 2: более общий метод, спасибо @SpghttCd за получение list_values
list_values = (dffinal.drop('final-formula', 1).groupby(['6month','Question Text']).sum()
.unstack('Question Text').fillna(0).astype(int).values.flatten('F'))
for rect, value in zip(ax.patches, list_values):
if value != 0:
h = rect.get_height() /2.
w = rect.get_width() /2.
x, y = rect.get_xy()
ax.text(x+w, y+h,value,horizontalalignment='center',verticalalignment='center')