1

我有一个需要制作维恩图的项目,并且我开始学习 python(使用 2.7),所以我认为尝试学习 R 也会使我的工作负担过重。所以,我在网上了解了matplotlib。基本上,我需要做的是创建一个维恩图,它比较每一列下的值以生成一个维恩图。因此,如果我的 csv 有以下数据:

Month    x    y
Sept    -1    1
Oct    0    1
Nov    1    1
Dec    -1    -1

重叠将显示值 2(因为 nov 和 dec 具有相同的值),x 圆本身将显示值 1,从 sept (需要忽略 0),y 圆将显示值2,从 9 月和 10 月。

我认为这是一个非常复杂的程序,但我不知道从哪里开始,除了从以下开始:

from matplotlib_venn import venn2

当我使用诸如Venny之类的在线工具时,它只会查找列表之间相似的数字,而不是进行逐行比较。这会导致外圈中的值为 0,而重叠中的值为 3(因为输入中有三个不同的值:-1、0 和 1。

或者,如果使用 R 而不是 Python 会很容易,你能帮我吗?

任何帮助将不胜感激,谢谢!

4

2 回答 2

7

在 R 中有很多选项可以构建维恩图。你可以得到其中的一些

library(sos)
findFn('Venn diagramm')

例如,使用 VennDiagram(列表中的第一个)您可以获得此图。我使用随机值来生成它,因为在你的问题中你如何考虑共享和交叉区域并不是很清楚。

在此处输入图像描述

library(VennDiagram)
# You should replace the random values here by your set of values
## 
set.seed(1)
A <- sample(1:100, 25, replace = FALSE)
B <- sample(1:100, 25, replace = FALSE)
C <- sample(1:100, 25, replace = FALSE)
D <- sample(1:100, 25, replace = FALSE)

venn.plot <- venn.diagram(
    x = list(
        Sept = A,
        Oct = D,
        Nov = B,
        Dec = C
    ),
    filename = NULL,
    col = "transparent",
    fill = c("cornflowerblue", "green", "yellow", "darkorchid1"),
    alpha = 0.50,
    label.col = c("orange", "white", "darkorchid4", "white", 
                                "white", "white", "white", "white", "darkblue", "white", 
                                "white", "white", "white", "darkgreen", "white"),
    cex = 1.5,
    fontfamily = "serif",
    fontface = "bold",
    cat.col = c("darkblue", "darkgreen", "orange", "darkorchid4"),
    cat.cex = 1.5,
    cat.pos = 0,
    cat.dist = 0.07,
    cat.fontfamily = "serif",
    rotation.degree = 270,
    margin = 0.2
)

grid.draw(venn.plot)
于 2013-12-02T11:30:58.833 回答
2

我不完全了解您的数字,但该matplotlib-venn软件包非常易于使用。在您的示例中(Xy, Yx, XY) = (1, 2, 2),您只需运行

import matplotlib_venn as venn
v = venn.venn2((1, 2, 2))
v.get_label_by_id('A').set_text('x')
v.get_label_by_id('B').set_text('y')

文档在这里,而且相当简单。更棘手的一点是(Xy, Yx, XY)从数据中提取元组,但我不太明白你的计算,抱歉。如果你能多解释一点,也许我可以在那里提供更多建议。

于 2013-12-02T22:44:12.280 回答