在 seaborn 中绘制多个布尔列

Plotting Multiple boolean cols in seaborn

我得到了一个包含两列的 DF,显示某人在这个月和上个月是否有部门。

Moroso morosoant
1      0
1      1
0      0

所以我想绘制两个列的已付和未付金额。

我试过这个来绘制 on

的值
sn.catplot(kind="bar",x="MOROSO",y="MOROSO",data=pd.DataFrame(df["MOROSO"].value_counts()))

我想在 moroso 列旁边添加 morosoant 列。

Seaborn 使用 "long form" 中的数据框最简单。 Pandas' melt() 可以合并列。使用 kind='count',seaborn 进行计数。要在图例中为 01 命名,.replace() 可以将它们更改为字符串。 Matplotlib 的新 bar_label 函数用它们的值标记条形。

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np

df = pd.DataFrame({'Moroso': np.random.randint(0, 2, 100),
                   'Morosoant': np.random.randint(0, 2, 100)})
df_long = df.melt(value_vars=['Moroso', 'Morosoant'], value_name='Legend').replace({'Legend': {0: 'No', 1: 'Yes'}})
sns.set_style('whitegrid')
g = sns.catplot(kind='count', data=df_long,
                x='variable', hue='Legend', palette='Set1', height=4, aspect=2)
g.set(xlabel='')
for ax in g.axes.flat:
    for bars in ax.containers:
        ax.bar_label(bars)
plt.subplots_adjust(left=0.07, bottom=0.15)
plt.show()

PS:如果df看起来像:

   Moroso  Morosoant
0       0          1
1       1          1
2       1          0
3       1          1
4       0          1

然后 df_long(替换之前)将如下所示:

    variable  Legend
0     Moroso       0
1     Moroso       1
2     Moroso       1
3     Moroso       1
4     Moroso       0
5  Morosoant       1
6  Morosoant       1
7  Morosoant       0
8  Morosoant       1
9  Morosoant       1