使用 matplotlib 绘制文氏图(venn)

时间:2023-01-07 23:36:39

包的安装

pip install matplotlib-venn

依赖于以下的包:

  • numpy
  • scipy
  • matplotlib

matplotlib-venn 主要用于绘制 two-circles 以及 three-circles 的文氏图。

使用

matplotlib-venn 包提供了四个主要的函数:venn2venn2-circlesvenn3venn3-circles

venn2venn2_circles接受一个3元素(Ab,aB,AB)构成的 tuple 作为各个子集所包含元素的个数(不是具体的元素):

  • Ab:包含A,但不包含B,即A中非B的部分, A¬B
  • aB:包含B,但不包含A,即B中非A, B¬A
  • AB:既包含A,又包含B,即A与B的交集, AB
venn2(subsets=(3, 2, 1), set_labels=('A', 'B'))

或者直接指定各自子集所包含的元素内容:

venn2([set(['A', 'B', 'C', 'D']), set(['D', 'E', 'F'])])
import matplotlib.pyplot as plt
from matplotlib_venn import venn
plt.figure(figsize=(4, 4))
venn2(subsets(3, 2, 1))
plt.show()


使用 matplotlib 绘制文氏图(venn)

图中的312分别表示各自子集的大小,而非集合中的元素内容;

v = venn2(subsets=(3, 0, 2), set_labels=('A', 'B'))
                    # 构造一种包含关系
v.get_label_by_id('10').set_text('')
v.get_label_by_id('01').set_text('')
v.get_label_by_id('11').set_text('')
                    # 或者设置任何你想设置的内容


使用 matplotlib 绘制文氏图(venn)

类似地,venn3venn3_circles 接受一个7个元素构成的元组作为各个子集的大小(Abc, aBc, ABc, abC, AbC, aBC, ABC):

from matplotlib_venn import venn3
def int2bin(n):
    s = bin(n)[2:]
    return (3-len(s))*'0'+s
                            # 1 ⇒ '001'
                            # 2 ⇒ '010'
                            # 3 ⇒ '011'
                            # ...
                            # 7 ⇒ '111'

v = venn3(subsets=(1, 1, 1, 1, 1, 1, 1))
for i in range(1, 8):
    v.get_label_by_id(int2bin(i)).set_text(int2bin(i))
plt.show()


使用 matplotlib 绘制文氏图(venn)

References

[1] matplotlib-venn 0.11.2