绘制所有子组 - 维恩图

Plotting all subgroups - venn diagram

我最近一直在处理 R,遇到了一个有趣的问题。我必须绘制 9 个单列数据集的所有可能维恩图(我们将它们命名为 df1...df9)。我正在使用 library(gplots),venn 的代码片段是:

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

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

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

# 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"
# ...

venn函数不支持5组以上的维恩图,1组的维恩图很无趣。因此,我将限制为包含两到五组的子集:

# 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 个维恩图对象。您可以绘制一个特定的,例如 plot(venns[[100]])

如果你真的想绘制所有维恩图,你可以这样做:

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

这将创建 372 个包含维恩图的图像文件,根据包含的集合命名。