【问题标题】:How to easily label bar plot using data frame column?如何使用数据框列轻松标记条形图?
【发布时间】:2018-08-22 02:26:04
【问题描述】:

我有一个看起来像这样的熊猫数据框:

     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 中类似的方式进行操作,但对于条形的所有颜色?我试图修复关于条形百分比的标签位置,但它并没有真正起作用。我期待一些想法!

编辑: 我想要做的仅显示在下图中的第 1 列和第 4 列:

【问题讨论】:

  • 我觉得这很难理解。字母代表什么?根据这些字母,情节应该如何?
  • 数据描述了每个字母在每个位置的分布情况。我想用字母来标记分布是属于的。
  • 已经有关于如何标记条形图的问题。他们在多大程度上没有帮助?

标签: python pandas dataframe matplotlib graph


【解决方案1】:

将注释放在您想要的位置很棘手,但这里有一个示例可能会有所帮助。我使用了一些虚拟数据,因此您必须确保它适用于您的数据,尽管它的形状相似。

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()

【讨论】:

    猜你喜欢
    • 2019-05-11
    • 2021-07-17
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 2013-01-10
    相关资源
    最近更新 更多