【问题标题】:Plot venn diagram with pandas and matplotlib_venn用 pandas 和 matplotlib_venn 绘制维恩图
【发布时间】:2016-06-09 11:46:40
【问题描述】:

我想根据我的 pandas 数据框绘制维恩图。我知道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 area = np.array(np.abs(diagram_areas), float)

TypeError: abs() 的操作数类型错误:'set'

【问题讨论】:

  • 你的集合之间可能没有重叠。你能检查len(set1 & set2)len(set1 & set3)len(set2 & set3)吗?
  • 最后,我找到了不同的方法。我没有插入数据集,而是按照以下示例仅输入数字:matthiaseisen.com/pp/patterns/p0144

标签: python pandas matplotlib-venn


【解决方案1】:

此错误是由于尝试将 2 个集合强制进入 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()
    

    这会生成以下输出:

    【讨论】:

      【解决方案3】:

      我相信你需要通过 3 组。基于code here,如果您传递三个子集,则它们在传递给compute_venn3_areas 之前被转换为一个元组,np.abs 可以处理它们。仅传递 2 组的情况看起来像是未处理的错误。

      【讨论】:

      • 你是对的,就是这个。但是,输出仍然不是应有的样子。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多