如何在Python Matplotlib_venn中从哑变量绘制维恩图?

70gysomp  于 2023-03-04  发布在  Python
关注(0)|答案(2)|浏览(114)

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

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多个观察结果的数据集,这三列是从一个变量中记录的,其中可以选择多个选项作为答案。我希望将数据可视化为一个图表,显示有多少人选择了第一、第二等,以及有多少人选择了第一和第二、第一和第三等。

py49o6xq

py49o6xq1#

使用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')
k10s72fa

k10s72fa2#

此函数根据包含布尔值的3列Pandas df绘制3圆维恩图。

from matplotlib_venn import venn3

def venn_diagram3_from_df(df):
    """Plots three primary circle Venn diagram from input df containing
    exactly three columns with True/False values.
    Uses venn3 from matplotlib_venn"""
    assert df.shape[1] == 3
    
    a_bool = df.iloc[:,0].values
    b_bool = df.iloc[:,1].values
    c_bool = df.iloc[:,2].values
    
    only_a = a_bool.sum()
    only_b = b_bool.sum()
    only_c = c_bool.sum()

    only_a_b = sum(a_bool & b_bool & ~c_bool)
    only_a_c = sum(a_bool & c_bool & ~b_bool)
    only_b_c = sum(b_bool & c_bool & ~a_bool)

    a_b_c = sum(a_bool & b_bool & c_bool)

    venn3(subsets=(only_a, only_b, only_a_b, only_c, only_a_c, only_b_c, a_b_c),
          set_labels=df.columns.tolist())

x = np.random.randint(2, size=(10,3))
df_ = pd.DataFrame(x, columns=['A', 'B','C']).astype(bool)

venn_diagram3_from_df(df_)

Three Variable Venn Diagram

相关问题