这是我的数据框:
6month final-formula Question Text numPatients6month
286231 1 0.031730 CI_FINANCE 977
286270 1 0.147390 CI_MJO 977
286276 1 0.106448 CI_CONCENTRATING 977
286700 2 0.010323 CI_MJO 775
286323 2 0.018065 CI_FINANCE 775
286401 2 0.034839 CI_CONCENTRATING 775
286228 3 0.032020 CI_CONCENTRATING 812
286238 3 0.061576 CI_MJO 812
286292 3 0.008621 CI_FINANCE 812
286690 4 0.008097 CI_MJO 741
286342 4 0.005398 CI_FINANCE 741
286430 4 0.060729 CI_CONCENTRATING 741
286481 5 0.009840 CI_FINANCE 813
287441 5 0.008610 CI_MJO 813
286362 5 0.041820 CI_CONCENTRATING 813
286360 6 0.021622 CI_CONCENTRATING 740
286492 6 0.017568 CI_FINANCE 740
286494 6 0.014865 CI_MJO 740
286482 7 0.015464 CI_FINANCE 776
286483 7 0.042526 CI_MJO 776
286599 7 0.011598 CI_CONCENTRATING 776
286361 8 0.024490 CI_CONCENTRATING 735
286989 8 0.004082 CI_FINANCE 735
286402 8 0.021769 CI_MJO 735
287119 9 0.003916 CI_FINANCE 766
286408 9 0.011749 CI_MJO 766
286399 9 0.019582 CI_CONCENTRATING 766
286267 10 0.019337 CI_CONCENTRATING 724
286249 10 0.037293 CI_MJO 724
286810 10 0.008287 CI_FINANCE 724
我已将此数据框绘制为堆叠的条形图。
此堆叠的条形图基于(6month,final-formula)
。
如您所见,数据框中有numPatients6month
。
我想在堆叠条形的每个类别上显示此数字。
例如:
因此,根据上面的堆叠栏,我想在第一栏中以蓝色显示977
,为CI_Finance
的{{1}}显示977。
它与 this问题不同,因为它不是堆叠条形,
另外,与 {strong> this不同,因为我将显示数据框中的另一列orange color
,而不是(numPatients6month)
中的列。
y轴为y-axis
,但我想在每个堆叠的条形的每种颜色上显示final-formula
。
仅供参考,我已使用以下代码绘制了以上内容:
numPatients6month
谢谢,:)
答案 0 :(得分:2)
这是一种实现方法:
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
)获得条形图的高度(宽度)。因此(x + w,y + h)给出了条形中间的坐标,您可以在其中添加文本value
(来自list_values
)和函数ax.text
(参数{{ 1}}和horizontalalignment
将文本居中
编辑2:更通用的方法,这要感谢@SpghttCd获得verticalalignment
list_values
答案 1 :(得分:2)
您可以直接从数据集中计算标签的x和y位置:
string path = @"" + /****path of excel file****/;
string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;";
OleDbConnection xlConn = new OleDbConnection(connectionString);
xlConn.Open();
OleDbCommand selectCommand = new OleDbCommand("SELECT * FROM [Sheet1$]", xlConn);
OleDbDataAdapter dataAdapter = new OleDbDataAdapter();
dataAdapter.SelectCommand = selectCommand;
itemMasterUploadDataTable = new System.Data.DataTable();
dataAdapter.Fill(itemMasterUploadDataTable );
xlConn.Close();
标签的排列方式可以与数据处理相同:
x_lbl = dffinal['6month'].values - 1
y_lbl = (df.cumsum(axis=1) - df/2).values.flatten()
,然后循环遍历x,y和label数组的列表:
df_lbl = dffinal.drop('final-formula', 1).groupby(['6month','Question Text']).sum().unstack('Question Text')
lbl = df_lbl.values.flatten()