r - 维恩图的 R 中的组合值
问题描述
我想在圆圈内绘制圆圈。我已经成功创建了一个三元组,我的代码中有以下细分:
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 =
解决方案
如果我理解您希望每个集合成为另一个集合的子集。这是电话:
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)
推荐阅读
- java - 无法从中获取标识符
- firebase - Firebase 存储管理员 - 未指定存储桶 -
- ruby-on-rails - 使用 Rspec 3 测试 ActiveAdmin - 一些控制器操作未命中
- java - 在 Android Studio 2.3.2 中使用 Java 8 不起作用
- gulp - 服务器端包括使用 browserSync-SSI 和 gulp?
- android - TypeError:无法读取 ionic 4 for android 中未定义的属性“openDatabase”
- python-3.x - 如何在 Google Colab 中从源文件(Google Drive)创建 zipfiles
- c# - OleDbCommand ExecuteNonQuery() 性能问题
- angular - 如何取消订阅观察者?
- postgresql-9.1 - 将远程 postgresql 9.1 数据库迁移到本地 postgresql 11