【问题标题】:Python Matplotlib Venn diagramPython Matplotlib 维恩图
【发布时间】:2013-11-19 10:17:16
【问题描述】:

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

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

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

【问题讨论】:

  • 你想如何在维恩图中“绘制”?您只是想要带有不同组的文本标签的 3 圆图吗?
  • 是的,没错,名字很长,所以对气泡大小有一些缩放效果会很好

标签: python matplotlib venn-diagram matplotlib-venn


【解决方案1】:

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

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)

link to image

【讨论】:

  • 这可以完成工作,但在大型列表(每个约 50k)上似乎相当慢。
  • 这是一个很好的观点。您可以改用矢量化函数。
【解决方案2】:

绘制维恩图的最简单方法

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

【讨论】:

  • 这个答案应该被打分,因为它非常简单和有效。太棒了!
【解决方案3】:

matplotlib 有一个漂亮的维恩图插件,名为matplotlib-venn。看起来它可以完全定制来做你想要的,从圆圈的大小(与设置的大小成比例)到内标签和外标签。

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

编辑:根据下面的 cmets,以下代码使用相同的库给出了与文本不重叠的圆圈:

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

给出图表:

【讨论】:

  • 我想把气泡分开,那不是重叠
  • @jonas Overlap 是维恩图,好吧,维恩图!它显示了类别之间的相互关系。然而,看在你的份上,看起来你可以简单地制作一堆奇异的维恩图,然后按照你的喜好将它们组合在一起。
  • @jonas 我添加了一个示例。公平地说,在我开始这个问题之前,我从来没有使用过图书馆,我只是阅读了文档。尝试阅读提供的链接,它可能会有所帮助。
  • @jonas 你的问题是“我如何画一个圆圈并在里面放文字?”。请参阅stackoverflow.com/questions/9215658/plot-a-circle-with-pyplotstackoverflow.com/questions/3439639/…stackoverflow.com/questions/17252790/… 以帮助您开始...
  • matplotlib-venn 包很棒,但它目前存在一个问题,导致某些集合具有wrong count
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多