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