【问题标题】:4-way Venn Diagram in R?R中的4向维恩图?
【发布时间】:2012-04-11 18:01:32
【问题描述】:

我正在尝试在 R 中制作 4 路维恩图。 我有这些数据要放入图表中:

谁能给我一个建议怎么做?我尝试使用函数 vennDiagram() 但这不起作用,因为它是一个 4way 图。

我也尝试使用 VennDiagram 包,但数据“分配”到图表中正确位置的方式确实令人困惑。我正在使用此代码:

library (VennDiagram)
venn.diagram(
    x=list(
    I=c(1:18,19:31,32:119,125:129,130:192,193:144,145:326,327:373),
    VI=c(516:542,510:515,420:497,498:509,145:326,327:373,130:192,193:144),
    II=c(19:31,32:119,145:326,327:373,374:378,378:419,420:497,498:509),
    III=c(506:509,378:419,32:119,125:129,130:192,145:326,420:497,510:515)
    ),
    filename = "4Way_Venn.tiff",
    col = "black",
    lty = "dotted",
    lwd = 4,
    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 = 2.5,
    fontfamily = "serif",
    fontface = "bold",
    cat.col = c("darkblue", "darkgreen", "orange", "darkorchid4"),
    cat.cex = 2.5,
    cat.fontfamily = "serif"
    );

谁能帮帮我?也许使用比使用 VennDiagram 包更简单的解决方案。

【问题讨论】:

  • Vennerable for R 不支持这个吗?我使用 Python 和 gnuplot 编写了一个解决方案。乐于分享。

标签: r venn-diagram


【解决方案1】:

我可能在这里遗漏了重点,但我不确定您想如何在制作维恩图时使用这些“计数”?从“c1”到“c4”列,您可以使用venneuler 包非常轻松地制作维恩图:

require(venneuler)
#here I replicate your data
#because it's repeatable, you can use `rep` function to generate it
c1 <- rep(c(0,1),each=8)
c2 <- rep(c(0,1),each=4,times=2)
c3 <- rep(c(0,1),each=2,times=4)
c4 <- rep(c(0,1),times=8)
#put your data into matrix
m <- as.matrix(data.frame(C1=c1,C2=c2,C3=c3,C4=c4))
#plot it
v = venneuler(m)
plot(v)

【讨论】:

  • Counts是每个案例发生的次数,是数据的汇总,应该在图中。例如数据中有 26 次 c1,c2,c3 和 c4 的值为 0
  • @Peiska:好的,我明白你的意思了,伙计。当我有更多时间时会尝试修改它。
  • 我认为这不能解决问题,但stackoverflow.com/questions/30638610/… 可能会有所帮助。
【解决方案2】:

请注意:我尝试在几个支持此类功能的软件包中构建 4(及更高)维恩图,但至少在一种情况下,子空间未正确绘制。例如,一个完全包含在另一个子集中的子集被绘制,其部分区域延伸到父子集之外。不幸的是,我不记得是哪个包做到了。
所以,我的答案是:尝试venneuler,正如 GOA 所说,尝试require(sos); ???venn,并确保仔细测试每个包以确保它呈现交叉点 正确。

【讨论】:

    【解决方案3】:

    使用新版本的 nVennR 包 (0.2.0),您可以通过两种方式实现:

    1) 根据您提供的代码,

    myV <- plotVenn(list(I=c(1:18,19:31,32:119,125:129,130:192,193:144,145:326,327:373), 
    IV=c(516:542,510:515,420:497,498:509,145:326,327:373,130:192,193:144), 
    II=c(19:31,32:119,145:326,327:373,374:378,378:419,420:497,498:509), 
    III=c(506:509,378:419,32:119,125:129,130:192,145:326,420:497,510:515)),
    setColors = c("cornflowerblue", "green", "yellow", "darkorchid1"), borderWidth=3, opacity=0.2)
    

    2) 直接来自第一个列表,

    myV2 <- createVennObj(nSets = 4, sNames = c("c1", "c2", "c3", "c4"), sSizes = c(26, 27, 4, 6, 5, 12, 42, 78, 18, 52, 4, 63, 13, 47, 88, 182))
    myV2 <- plotVenn(nVennObj = myV2)
    

    第一种方式的一个优点是可以查询每个区域的元素:

    getVennRegion(myV, c("I", "III"))
    [1] 125 126 127 128 129
    

    【讨论】:

      【解决方案4】:

      VennDiagram 包中有一个 4way Venn 的函数,即 draw.quad.venn() 函数:

      http://cran.r-project.org/web/packages/VennDiagram/VennDiagram.pdf

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-04
        • 1970-01-01
        • 2014-03-10
        • 2015-07-02
        • 2023-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多