【问题标题】:combination values in R for venn diagram维恩图的 R 中的组合值
【发布时间】:2018-05-04 06:16:47
【问题描述】:

我想在圆圈内绘制圆圈。我已经成功创建了一个三元组,我的代码中有以下细分:

venn.plot <- draw.triple.venn(
area1 = 1171,
area2 = 979,
area3 = 579,
n12 = 979,
n13 = 579,
n23 = 579,
n123 = 579,

最小的圆是579,下一个圆加400是979,下一个加192是1171。

我想将其扩展为 5 级,下一个加 52 为 1223,最后一个加 11 为 1234。

我无法计算出成功生成图表的组合值。我得到的错误是

ERROR [2018-05-04 16:05:48] Impossible: a5 <- area5 - a6 - a7 - a15 - a16 - a17 - a18 - a25 - a26 - a27 - a28 - a31 - a20 - a29 - a21 - a10 produces negative area Error in draw.quintuple.venn(area1 = 1234, area2 = 1223, area3 = 1171,  :   Impossible: a5 <- area5 - a6 - a7 - a15 - a16 - a17 - a18 - a25 - a26 - a27 - a28 - a31 - a20 - a29 - a21 - a10 produces negative area

显然我加起来是错误的。

我应该为这些使用的 n 值是多少? n12 = n13 = n14 = n15 = n23 = n24 = n25 = n34 = n35 = n45 = n123 = n124 = n125 = n134 = n135 = n145 = n234 = n235 = n245 = n345 = n1234 = n1235 = n1245 = n1345 = n2345 = n12345 =

【问题讨论】:

    标签: r venn-diagram


    【解决方案1】:

    如果我理解您希望每个集合成为另一个集合的子集。这是电话:

    library(VennDiagram)
    venn.plot <- draw.quintuple.venn(
      area1 = 579L,
      area2 = 979L,
      area3 = 1171L,
      area4 = 1223L,
      area5 = 1234L,
      n12 = 579L,
      n13 = 579L,
      n14 = 579L,
      n15 = 579L,
      n23 = 979L,
      n24 = 979L,
      n25 = 979L,
      n34 = 1171L,
      n35 = 1171L,
      n45 = 1223L,
      n123 = 579L,
      n124 = 579L,
      n125 = 579L,
      n134 = 579L,
      n135 = 579L,
      n145 = 579L,
      n234 = 979L,
      n235 = 979L,
      n245 = 979L,
      n345 = 1171L,
      n1234 = 579L,
      n1235 = 579L,
      n1245 = 579L,
      n1345 = 579L,
      n2345 = 979L,
      n12345 = 579L)
    

    每个区域交叉点等于参与其中的最小区域。

    现在这太麻烦了,特别是如果您需要经常执行它,这是一种编程方式:

    定义你的集合:

    val = c(579, 979, 1171, 1223, 1234)
    

    给它命名

    names(val) ;- LETTERS[1:length(val)]
    

    也许有更优雅的方式,但从我的头顶:

    z <- lapply(1:length(val),function(x){
      comb <- combn(names(val), m = x) #all combination of 1:5 elements of names
      value <- apply(comb, 2, function(i){ #for each combination return minumum from val vector
        return(min(val[names(val) %in% i]))
      })
      set <- apply(comb, 2, paste0, collapse = "&", sep = "") #paste the names with "&" in beetwean
      names(value) = set
      return(value)
    })
    

    分别运行每一行代码(例如使用 3 而不是 x)以了解它的作用。

    z <- unlist(z)
    
    library(eulerr) # a nice library
    plot(euler(z, input = "union"), quantities = T)
    

    让它变成一个函数:

    create_eulerr_data <- function(val){
      z <- lapply(1:length(val),function(x){
      comb <- combn(names(val), m = x)
      value <- apply(comb, 2, function(i){
        return(min(val[names(val) %in% i]))
      })
      set <- apply(comb, 2, paste0, collapse = "&", sep = "")
      names(value) = set
      return(value)
      })
      z <- unlist(z)
      }
    

    现在这样做的好处是它适用于任意数量的集合:

    val <- c(26, 53, 78)
    names(val) <- LETTERS[1:length(val)]
    plot(euler(create_eulerr_data(val),
               input = "union"),
         quantities = T)
    

    val <- c(26, 53, 78, 112, 134, 158)
    names(val) <- LETTERS[1:length(val)]
    plot(euler(create_eulerr_data(val),
               input = "union"),
         quantities = T)
    

    即使您提供未排列的值,它也会起作用:

    val <- c(26, 78, 53)
    names(val) <- LETTERS[1:length(val)]
    plot(euler(create_eulerr_data(val),
               input = "union"),
         quantities = T)
    

    【讨论】:

    • 这是完美的。非常感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 2023-01-14
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 2010-11-28
    相关资源
    最近更新 更多