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

2024-09-29 01:25:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有熊猫数据帧,如下所示:

     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


Tags: 数据matplotlib绘制标签条形图pos1aa2aa1
1条回答
网友
1楼 · 发布于 2024-09-29 01:25:23

很难将注释放在您想要的地方,但是下面的示例可能会有所帮助。我使用了一些虚拟数据,所以您必须确保它适用于您的数据,尽管它的形状类似。在

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

相关问题 更多 >