matplotlib Pandas如何在一个图形中绘制多个0/1分布

ecbunoof  于 2022-12-19  发布在  其他
关注(0)|答案(2)|浏览(155)

我有一个数据集,看起来像这样:

label colA colB colC
  0     1    0    0
  0     0    1    0
  1     0    0    1
  1     1    0    1

每一行将被标记为0或1,并且colA、colB和colC中只有一个为1,其他为0。
我想绘制一个类似的图形(Y为计数,X为0/1):

根据给出的例子,总共有6列,因为有3列表示0标签,3列表示1标签。我该怎么做?我知道如何绘制一列df[df['colA']==1]['label'].plot(),但不知道如何将多列组合在一起。

cs7cruho

cs7cruho1#

看起来您可能需要groupby.sum,然后是plot.bar

df.groupby('label').sum().plot.bar()
  • 注意:如果您需要比例,请使用df.groupby('label').mean().plot.bar()。*

输出:

pxy2qtax

pxy2qtax2#

如果我没理解错的话,你可能是在找这样的东西:

import matplotlib.pyplot as plt

X_axis = [int(x) for x in df['labels']]
cols = df.drop(['labels'], axis=1).columns
width = 0.25
color_dict = {0: 'red', 1: 'blue', 2: 'green'}
for i, c in enumerate(cols):
  plt.bar(0 + width*(i - len(cols)//2), len(df[(df['labels'] == 0) & (df[c] == 1)]), width, color=color_dict[i%len(cols)], label=c)
  plt.bar(1 + width*(i - len(cols)//2), len(df[(df['labels'] == 1) & (df[c] == 1)]), width, color=color_dict[i%len(cols)], label=c)
plt.xticks(X_axis, df['labels'])

handles, labels = plt.gca().get_legend_handles_labels()
by_label = dict(zip(labels, handles))
plt.legend(by_label.values(), by_label.keys())

对于您提供的数据,结果应如下所示

相关问题