如何从 Python Matplotlib_venn 中的虚拟变量绘制维恩图?

How to draw venn diagram from a dummy variable in Python Matplotlib_venn?

我有以下代码来绘制维恩图。

import numpy as np
import pandas as pd
import matplotlib_venn as vplt

x = np.random.randint(2, size=(10,3))
df = pd.DataFrame(x, columns=['A', 'B','C'])
print(df)
v = vplt.venn3(subsets=(1,1,1,1,1,1,1))

输出如下所示:

其实我想用数据集找出subsets()中的数字。怎么做?或者是否有任何其他简单的方法可以直接从数据集中制作这些维恩图。 我还想在它周围做一个框并注释剩余区域,因为所有 A、B、C 的人都为 0。然后计算每个圆圈中的人的百分比并将其保留为标签。不确定如何实现这一目标。

问题背景:

我有一个包含 500 多个观察值的数据集,这三列是从一个变量中记录的,其中可以选择多个选项作为答案。 我想在图表中可视化数据,显示有多少人选择了第一、第二等,以及有多少人选择了第一和第二、第一和第三等,

使用 numpy.argwhere 获取每一列的 1 的索引并将它们绘制成结果

In [85]: df
Out[85]: 
   A  B  C
0  0  1  1
1  1  1  0
2  1  1  0
3  0  0  1
4  1  1  0
5  1  1  0
6  0  0  0
7  0  0  0
8  1  1  0
9  1  0  0

In [86]: sets = [set(np.argwhere(v).ravel()) for k,v in df.items()]
    ...: venn3(sets, df.columns)
    ...: plt.show()

注意:如果您想绘制一个包含不属于任何类别的项目数量的额外方框,请添加以下行:

In [87]: ax = plt.gca()

In [88]: xmin, _, ymin, _ = ax.axes.axis('on')

In [89]: ax.text(xmin, ymin, (df == 0).all(1).sum(), ha='left', va='bottom')