绘制所有子组 - 维恩图

时间:2015-04-20 20:08:00

标签: r statistics combinations

我最近一直在和R打交道,我遇到了一个有趣的问题。我必须绘制9个单列数据集的所有可能的维恩图(让我们将它们命名为df1 ... df9)。我正在使用库(gplots),venn的代码片段带有示例输入:

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

问题是:如何生成这九个数据集的所有可能子集(总共有126个 - 计算过的使用过的梳子函数。),并将它们导出到列表中,这可以输入到venn中。例如: (DF1,DF2), (DF5,DF4), (DF3,DF5 DF8) 。 。 。 在这里,我将遍历所有选项并绘制每个选项的维恩图。 谢谢你的任何提示。

1 个答案:

答案 0 :(得分: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"
# ...

venn函数不支持超过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个维恩图对象。例如,您可以使用plot(venns[[100]])

绘制特定的一个

enter image description here

如果你真的想要绘制所有的维恩图,你可以做类似的事情:

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

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