在数据框的不同列中显示堆积条形图的每种颜色上的值

时间:2018-06-26 15:53:11

标签: python pandas dataframe matplotlib data-analysis

这是我的数据框:

          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。 我想在堆叠条形的每个类别上显示此数字。 例如:

这是我的图表: enter image description here

因此,根据上面的堆叠栏,我想在第一栏中以蓝色显示977,为CI_Finance的{​​{1}}显示977。

它与 this问题不同,因为它不是堆叠条形, 另外,与 {strong> this不同,因为我将显示数据框中的另一列orange color,而不是(numPatients6month)中的列。 y轴为y-axis,但我想在每个堆叠的条形的每种颜色上显示final-formula

仅供参考,我已使用以下代码绘制了以上内容:

numPatients6month

谢谢,:)

2 个答案:

答案 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相同,结果为:

enter image description here

但是由于某些条形很小,因此结果很难真正阅读。

编辑:关于循环,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()

enter image description here