绘制所有子组 - 维恩图

3

最近我在处理R语言相关的问题时遇到了一个有趣的难题。我需要绘制9个单列数据集(我们将它们命名为df1...df9)的所有可能的Venn图。我正在使用library(gplots)库,并且使用如下代码来进行venn绘图,以下是一个示例输入:

venn(list(df1,df2,df3,df4))

问题是:如何生成这九个数据集的所有可能子集(总共有126个 - 使用combs函数计算),并将它们导出为一个列表,该列表可以作为输入用于维恩图。例如: (df1,df2), (df5,df4), (df3,df5,df8) ...... 在此,我将遍历所有选项,并为每个绘制Venn图。 感谢您提供的任何提示。

你知道这会给你带来512个维恩图,对吧?你确定这是你想要的吗?此外,我不知道有任何支持超过5个集合的实现。我记得在这里回答了一个相关的问题(https://dev59.com/G2Ag5IYBdhLWcg3wdq0y#23560500)。 - Anders Ellern Bilgrau
是的,我的目的不是为了绘制它们所有,只是为了了解这种方法。而提供的答案非常完美。 - sdgaw erzswer
1个回答

8

让我们从一个可重现的例子开始:

# Sample data (9 15-element subsets of the letters stored in a list)
set.seed(144)
(dfs <- replicate(9, sample(letters, 15), simplify=FALSE))
# [[1]]
#  [1] "b" "r" "y" "l" "g" "n" "a" "u" "z" "s" "j" "c" "h" "x" "m"
# 
# [[2]]
#  [1] "b" "n" "m" "t" "i" "f" "a" "l" "k" "u" "o" "c" "g" "v" "p"
# ...
< p > venn 函数不支持超过5个集合的维恩图,而一个集合的维恩图相当无聊。因此,我将限制子集只有2到5个集合:

# Get all subsets with 2-5 elements
subs <- do.call(expand.grid, replicate(length(dfs), c(F, T), simplify=F))
subs <- subs[rowSums(subs) %in% 2:5,]
venns <- apply(subs, 1, function(x) venn(dfs[x], show.plot=F))

venns 现在包含了你的 372 个 Venn 图对象。你可以使用如下命令绘制其中一个图形:plot(venns[[100]])

enter image description here

如果你真的想要绘制出所有的 Venn 图,你可以尝试执行以下代码:

apply(subs, 1, function(x) {
  png(paste0("venn_", paste(which(x), collapse="_"), ".png"))
  venn(dfs[x])
  dev.off()
})

这将创建372个图片文件,包含维恩图,并以所包含的集合为命名。

这很棒,当然我不需要全部,但知道如何做才是关键,这太棒了! - sdgaw erzswer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接