46

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

假设我有 6 个变量,我想将它们分类到这 3 个组中并像维恩图一样绘制。我想将变量名称注释到三个气泡中。
在这个简单的例子中,我们可以说 1 个变量在第 1 组中,3 个变量在第 2 组中,2 个变量在第 3 组中。

谁能帮我举一个简单的例子来说明如何在 matplotlib 中做到这一点?

4

3 回答 3

64

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()

给出图表:

在此处输入图像描述

于 2013-11-07T16:46:27.777 回答
25

绘制维恩图的最简单方法

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()

在此处输入图像描述

于 2020-12-29T01:25:40.763 回答
3

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

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)

图片链接

于 2020-12-01T22:23:33.943 回答