使用pandas和matplotlib_venn绘制Venn图

5

我希望能基于我的pandas数据框绘制出venn图。我了解到matplotlib_venn接受集合作为输入。我的数据集包含客户ID和其他两列信息,用于表示客户是否参与了推广活动。

df_dataset = pd.read_csv('...path...',delimiter=',',decimal=',')
campaign_a = df_dataset[(df_dataset['CAM_A'] == 1)] 
campaign_b = df_dataset[(df_dataset['CAM_B'] == 1)]

plt.figure(figsize=(4,4))
set1 = set(campaign_a['CLI_ID'])
set2 = set(campaign_b['CLI_ID'])

venn3([set1, set2], ('Set1', 'Set2'))
plt.show()

然而我遇到了一个错误:

文件"C:\Python27\Lib\site-packages\matplotlib_venn_venn3.py"中的第44行,compute_venn3_areas函数无法正常运行

导致错误的原因是:bad operand type for abs(): 'set'


你的集合之间可能没有重叠。你能检查一下 len(set1 & set2)len(set1 & set3)len(set2 & set3) 吗? - IanS
最后,我找到了不同的方法。我没有插入数据集,而是只输入数字,按照这个例子:http://matthiaseisen.com/pp/patterns/p0144/ - HonzaB
3个回答

4

出现这个错误是因为试图将两组数据强制转换到venn3上,你需要从同一库中导入venn2。

from matplotlib_venn import venn2

df_dataset = pd.read_csv('...path...',delimiter=',',decimal=',')
campaign_a = df_dataset[(df_dataset['CAM_A'] == 1)] 
campaign_b = df_dataset[(df_dataset['CAM_B'] == 1)]

plt.figure(figsize=(4,4))
set1 = set(campaign_a['CLI_ID'])
set2 = set(campaign_b['CLI_ID'])

venn2([set1, set2], ('Set1', 'Set2'))
plt.show()

2

创建少量集合的韦恩图的简单方法。希望这有所帮助。

import matplotlib.pyplot as plt
from matplotlib_venn import venn2
from matplotlib_venn import venn3

set1 = set()
set2 = set()
set3 = set()
set4 = set()
set_array = []
set_names = ['Set1', 'Set2', 'Set3', 'Set4']

set1.add('a')
set1.add('b')

set2.add('b')
set2.add('c')

set3.add('c')
set3.add('d')

set4.add('d')
set4.add('e')

set_array.append(set1)
set_array.append(set2)
set_array.append(set3)
set_array.append(set4)

# venn2([set1, set2], ('Set1', 'Set2')) # venn2 works for two sets
venn3(set_array[0:3], set_names[0:3])   # venn3 works for three sets
plt.show()

这将生成以下输出:

示例


1
我认为你需要通过3个集合。基于这里的代码,如果你通过了三个子集,那么它们在传递给compute_venn3_areas之前会被转换为元组,其中np.abs可以处理它们。当你只传递2个集合时,看起来像是一个未处理的错误。

你是对的,就是这个问题。但是,输出结果还不如预期。 - HonzaB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接