如何使用数据框列轻松标记条形图?

时间:2018-03-13 17:56:57

标签: python pandas dataframe matplotlib graph

我有pandas数据框,如下所示:

     pos1   pos2   pos3   pos4   pos5 aa1 aa2 aa3 aa4 aa5
0   38.81  16.08  12.33   8.35   7.95   A   T   N   F   P
1   45.51  41.48   5.34   2.27   1.65   A   T   V   F   I
2   41.14  22.27   9.38   6.93   6.08   T   D   V   N   P
3   37.84  19.77  14.26  13.64  11.53   V   E   Q   L   A
4   35.74  28.75  14.09   9.72   4.89   G   N   P   D   E
5   52.44  13.98  11.88   8.64   8.18   G   S   Q   H   D
6   40.28  13.58  11.70  10.85   8.75   T   N   E   V   I
7   57.44  25.06  13.98   1.99   1.08   V   I   M   T   A
8   55.68  10.80  10.11   9.55   7.39   H   Q   K   T   N
9   96.02   2.50   0.74   0.17   0.17   F   Q   I   L   V
10  57.27  13.92   9.72   6.82   4.94   K   Q   E   N   V
11  67.61  12.95  11.93   3.98   0.97   E   V   T   K   I
12  63.52  25.57   9.38   0.80   0.28   V   I   L   A   T
13  51.93  44.26   1.70   0.80   0.80   V   I   H   T   D
14  38.81  20.97  15.91  12.44   8.35   N   D   A   E   S
15  73.12  13.86   4.49   2.84   1.59   A   E   T   S   Y

给出用matplotlib绘制的条形图:

Bar plot from the dataframe

但是,我想使用列aa1 - aa5作为单个条的每个段的内部标签。是否有可能以与matplotlib tutorial中相似的方式进行,但是对于酒吧的所有颜色?我试图确定关于酒吧百分比的标签位置,但它并没有真正起作用。我期待着一些想法!

编辑: 我想要做的只在第1列和第4列的下图中显示: The aim of this question

1 个答案:

答案 0 :(得分:0)

将注释正确地放在您想要的地方很棘手,但这里有一个可能有用的示例。我已经使用了一些虚拟数据,因此您必须确保它适用于您的数据,尽管它的形状类似。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import random
import string

# dummy data
no_bars = 15
no_stacked = 5
df = pd.DataFrame(np.random.randint(5, 20, (no_bars, no_stacked)), columns=['pos1', 'pos2', 'pos3', 'pos4', 'pos5'])

#random letters in a dataframe
ltrs = pd.DataFrame([random.sample(list(string.ascii_uppercase), no_bars) for _ in range(no_stacked)])

ax = df.plot.bar(stacked=True, width=.8)

#annotate each 'patch' one by one (1D
j = 0
i = 0
for lbl in ax.patches:
    ax.annotate(ltrs.iloc[j, i], (lbl.get_x()+.2, lbl.get_y()+.3), color='white')
    i+=1
    if i == no_bars:
        j += 1
        i = 0
plt.tight_layout(rect=[0, 0, 0.85, 1])
ax.legend(loc='center left', bbox_to_anchor=(1, .5))

plt.show()

enter image description here