Python Matplotlib维恩图

jon*_*nas 32 python matplotlib venn-diagram matplotlib-venn

我想绘制属于某些组的变量.

假设我有6个变量,我想要分成这3组,并绘制像维恩图.我想将变量名称注释为三个气泡.
在这个简单的例子中,我们可以说1个变量在组1中,3个变量在组2中,2个变量在组3中.

任何人都可以帮我一个简单的例子来说明如何在matplotlib中做到这一点?

Hoo*_*ked 52

matplotlib有一个美丽的维恩图插件,名为matplotlib-venn.从圆圈的大小(与设置大小成比例)到内部和外部标签,它看起来可以完全自定义以满足您的需求.

使用网站上的示例代码给出如下情节:

在此输入图像描述

编辑:根据下面的注释,以下代码使用相同的库为非重叠的圆圈提供文本:

import pylab as plt
from matplotlib_venn import venn3, venn3_circles

v = venn3(subsets=(1,1,0,1,0,0,0))
v.get_label_by_id('100').set_text('First')
v.get_label_by_id('010').set_text('Second')
v.get_label_by_id('001').set_text('Third')
plt.title("Not a Venn diagram")
plt.show()
Run Code Online (Sandbox Code Playgroud)

给出图表:

在此输入图像描述

  • @jonas Overlap是维恩图的原因,嗯,维恩图!它显示了类别之间的相互关系.然而,为了你的缘故,看起来你可以简单地制作一堆单一的维恩图并将它们放在一起如何取悦你. (5认同)
  • @jonas你的问题是"我如何绘制一个圆圈并将文字放入其中?".请参阅http://stackoverflow.com/questions/9215658/plot-a-circle-with-pyplot http://stackoverflow.com/questions/3439639/matplotlib-add-circle-to-plot http://stackoverflow.com/questions/17252790/matplotlib-adding-text-with-more-than-line-adding-text-that-c​​an-follow-to to get you ... (4认同)
  • @jonas我添加了一个例子.公平地说,在我开始这个问题之前,我从未习惯过图书馆,我只是阅读了文档.尝试通过提供的链接阅读,它可能会有所帮助. (3认同)

bit*_*ang 9

绘制维恩图的最简单方法

import matplotlib.pyplot as plt
from matplotlib_venn import venn3

set1 = set(['A', 'B', 'C'])
set2 = set(['A', 'B', 'D'])
set3 = set(['A', 'E', 'F'])

venn3([set1, set2, set3], ('Group1', 'Group2', 'Group3'))

plt.show()
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • 这个答案应该因为非常简单和有效而评分。杰出的! (2认同)

Sör*_*ren 5

在这里您可以只传递数组并计算重叠。

import numpy as np
from matplotlib_venn import venn3

def venn_diagram(a, b, c, labels=['A', 'B', 'C']):

    a = set(a)
    b = set(b)
    c = set(c)

    only_a = len(a - b - c)
    only_b = len(b - a - c)
    only_c = len(c - a - b)

    only_a_b = len(a & b - c)
    only_a_c = len(a & c - b)
    only_b_c = len(b & c - a)

    a_b_c = len(a & b & c)

    venn3(subsets=(only_a, only_b, only_a_b, only_c, only_a_c, only_b_c, a_b_c), set_labels=labels)

a, b, c = np.round(np.random.rand(3, 50000), 5)
venn_diagram(a, b, c)
Run Code Online (Sandbox Code Playgroud)

链接到图像