维恩图 5 种方式(带有“维恩”R)

问题描述 投票:0回答:2

首先我想为我的基本问题道歉。 我确信,如果我是一个有经验的用户,关于这个主题的其他线程将会令人满意,但即使在阅读它们之后我也无法管理。 因此,如果这可能会让您烦恼,欢迎忽略。

对于那些仍然想提供帮助的人: 我正在尝试创建一个五向维恩图。 我的数据在 Excel 中排列为 5 列(每列代表一个站点 A-E),每行代表五个站点中每个站点的物种丰度 (0 - 16)。

我想创建一个与此类似的漂亮维恩图: https://i.stack.imgur.com/TeRSJ.png

我确信它可能只需要点击几下。 但我无法做到: 以写入方式加载我的数据 - 应该是什么格式?数据集?列表?矩阵?

我认为 R 似乎建议我只能使用存在缺席数据(0/1),对吗?

最终我想我会使用这个命令与 x 作为我的数据

venn(x, snames = c(""), ilabels = FALSE, counts = FALSE, zcolor = c("bw"),
transparency = 0.3, ellipse = FALSE, size = 15, cexil = 0.45, cexsn = 0.85, 
...)

谁能告诉我要使用什么代码? 如果有人告诉我如何在这里上传我的数据集,我也可以上传我的数据集。

提前致谢

r venn-diagram
2个回答
0
投票

嗨,莫蒂斯,我尝试了你发布的脚本。 我在Excel中计算了重叠部分,最终得到:

library(VennDiagram);
venn.plot <- draw.quintuple.venn(
  area1 = 104, area2 = 120, area3 = 117, area4 = 158, area5 = 107,
  n12 = 59, n13 = 39, n14 = 55, n15 = 41,
  n23 = 48, n24 = 71, n25 = 48,
  n34 = 53, n35 = 53, n45 = 62,
  n123 = 30, n124 = 44, n125 = 35,
  n134 = 34, n135 = 30, n145 = 38,
  n234 = 42, n235 = 35, n245 = 44,
  n345 = 40, n1234 = 28, n1235 = 25, n1245 = 33,
  n1345 = 27, n2345 = 32,
  n12345 = 24,
  category = c("A", "B", "C", "D", "E"),
  fill = c("dodgerblue", "goldenrod1", "darkorange1", "seagreen3", "orchid3"),
  cat.col = c("dodgerblue", "goldenrod1", "darkorange1", "seagreen3", "orchid3"),
  cat.cex = 2,
  margin = 0.05,
  cex = c(
    1.5, 1.5, 1.5, 1.5, 1.5, 1, 0.8, 1, 0.8, 1, 0.8, 1, 0.8, 1, 0.8,
    1, 0.55, 1, 0.55, 1, 0.55, 1, 0.55, 1, 0.55, 1, 1, 1, 1, 1, 1.5),
  ind = TRUE);

png("venn_5set.png");
grid.draw(venn.plot);
dev.off();

但是我得到了一个错误:

draw.quintuple.venn 中的错误(区域1 = 104,区域2 = 120,区域3 = 117, 面积 4 = 158,:不可能:a17 <- n135 - a27 - a29 - a31 produces negative area

a17 是哪个?


0
投票

免责声明 1:我不确定您的问题是否是关于如何计算每个子组的计数,或者如何绘制 5 组维恩图。我假设是后者。

免责声明 2:我发现 5 组维恩图极其难以阅读。到了无用功的地步。但这是我个人的看法。

如果可以选择其他 R 包,这里有一个使用

VennDiagram
制定的 5 组示例(直接来自 VennDiagram 参考手册

library(VennDiagram);
venn.plot <- draw.quintuple.venn(
    area1 = 301, area2 = 321, area3 = 311, area4 = 321, area5 = 301,
    n12 = 188, n13 = 191, n14 = 184, n15 = 177,
    n23 = 194, n24 = 197, n25 = 190,
    n34 = 190, n35 = 173, n45 = 186,
    n123 = 112, n124 = 108, n125 = 108,
    n134 = 111, n135 = 104, n145 = 104,
    n234 = 111, n235 = 107, n245 = 110,
    n345 = 100,
    n1234 = 61, n1235 = 60, n1245 = 59,
    n1345 = 58, n2345 = 57,
    n12345 = 31,
    category = c("A", "B", "C", "D", "E"),
    fill = c("dodgerblue", "goldenrod1", "darkorange1", "seagreen3", "orchid3"),
    cat.col = c("dodgerblue", "goldenrod1", "darkorange1", "seagreen3", "orchid3"),
    cat.cex = 2,
    margin = 0.05,
    cex = c(
        1.5, 1.5, 1.5, 1.5, 1.5, 1, 0.8, 1, 0.8, 1, 0.8, 1, 0.8, 1, 0.8,
        1, 0.55, 1, 0.55, 1, 0.55, 1, 0.55, 1, 0.55, 1, 1, 1, 1, 1, 1.5),
    ind = TRUE);

png("venn_5set.png");
grid.draw(venn.plot);
dev.off();


更新 [2017 年 11 月 15 日]

您的源表采用非典型格式。正如我在评论中所解释的,您通常从“二元矩阵”(每组一列,“每个观察”的成员资格由 0 或 1 表示)或“集合元素列表”开始。 说实话,我越来越不确定你到底想做什么。我有一种感觉,人们对维恩图可能存在误解。例如,让我们看一下表格的第一行 # Read data library(readxl); data <- as.data.frame(read_excel("~/Downloads/dataset4venn.xlsx")); rownames(data) <- data[, 1]; data <- data[, -1]; head(data); # A B C D E #1 8 8 7 8 10 #2 0 0 10 0 2 #3 0 0 0 0 3 #4 0 0 1 2 0 #5 1 0 1 0 2 #6 0 0 0 0 1 观察结果是特定群体(即采样点)中存在(由

1

编码)或不存在(由

0
 编码)
独特元素

(在您的情况下是一个物种)。您所说的“目击次数”在这里并不重要:维恩图探讨了在不同地点采样的不同物种之间的“逻辑”关系,或者换句话说,A-E 地点共享哪些独特物种。


话虽如此,忽略每个站点的目击数量,您可以在下面的 5 组维恩图中显示不同站点之间的重叠。我首先定义一个辅助函数
cts
来计算每组/重叠的计数,然后将这些数字输入 draw.quintuple.venn # Function to calculate the count per group/overlap # Note: data is a global variable cts <- function(set) { df <- data; for (i in 1:length(set)) df <- subset(df, df[set[i]] >= 1); nrow(df); } # Plot library(VennDiagram); venn.plot <- draw.quintuple.venn( area1 = cts("A"), area2 = cts("B"), area3 = cts("C"), area4 = cts("D"), area5 = cts("E"), n12 = cts(c("A", "B")), n13 = cts(c("A", "C")), n14 = cts(c("A", "D")), n15 = cts(c("A", "E")), n23 = cts(c("B", "C")), n24 = cts(c("B", "D")), n25 = cts(c("B", "E")), n34 = cts(c("C", "D")), n35 = cts(c("C", "E")), n45 = cts(c("D", "E")), n123 = cts(c("A", "B", "C")), n124 = cts(c("A", "B", "D")), n125 = cts(c("A", "B", "E")), n134 = cts(c("A", "C", "D")), n135 = cts(c("A", "C", "E")), n145 = cts(c("A", "D", "E")), n234 = cts(c("B", "C", "D")), n235 = cts(c("B", "C", "E")), n245 = cts(c("B", "D", "E")), n345 = cts(c("C", "D", "E")), n1234 = cts(c("A", "B", "C", "D")), n1235 = cts(c("A", "B", "C", "E")), n1245 = cts(c("A", "B", "D", "E")), n1345 = cts(c("A", "C", "D", "E")), n2345 = cts(c("B", "C", "D", "E")), n12345 = cts(c("A", "B", "C", "D", "E")), category = c("A", "B", "C", "D", "E"), fill = c("dodgerblue", "goldenrod1", "darkorange1", "seagreen3", "orchid3"), cat.col = c("dodgerblue", "goldenrod1", "darkorange1", "seagreen3", "orchid3"), cat.cex = 2, margin = 0.05, cex = c( 1.5, 1.5, 1.5, 1.5, 1.5, 1, 0.8, 1, 0.8, 1, 0.8, 1, 0.8, 1, 0.8, 1, 0.55, 1, 0.55, 1, 0.55, 1, 0.55, 1, 0.55, 1, 1, 1, 1, 1, 1.5), ind = TRUE); png("venn_5set.png"); grid.draw(venn.plot); dev.off();



PS

各种 R 包/互联网资源提供了帮助函数来计算重叠,例如基于二进制矩阵或集合元素列表。例如,R/Bioconductor 包
limma
提供了一个函数

limma::vennCounts,可以根据二进制矩阵计算所有重叠的计数。因此,如果您不想编写自己的函数(就像我一样),您也可以使用它们。无论哪种方式,在更复杂的维恩图的情况下,我建议not手动计算重叠,因为很容易出错(请参阅错误消息)。

© www.soinside.com 2019 - 2024. All rights reserved.