【问题标题】:venn diagram 5 way (with 'venn' R)维恩图 5 路(带 'venn' R)
【发布时间】:2017-11-13 08:35:24
【问题描述】:

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

对于那些仍想提供帮助的人: 我正在尝试创建一个 5 向维恩图。 我的数据在 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, 
...)

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

提前致谢

【问题讨论】:

  • 以上 3 个类别的维恩图不能按比例表示每个类别和交叉点的空间。一个新的包UpSetR 以一种新的更简单的形式(恕我直言)表示类别之间的比较。
  • 你是对的@Llopis。然而(不幸的是,在我看来),k > 3 的 k 集维恩图在许多研究领域(生物医学研究、社会科学等)中非常流行。
  • 我知道,我在这样的领域之一。这就是为什么我认为我们可以反驳说这个图比维恩图更有帮助,因为条形与交叉点成正比。
  • 完全同意你@Llopis(看来我们在类似领域工作)。没听说过UpSetR,谢谢分享;看起来很有趣!
  • 我明白你的意思,伙计们,打乱者看起来不错。但视觉上不那么令人愉悦。我可以试一试,我应该如何准备我的数据集?以及如何上传?!

标签: r venn-diagram


【解决方案1】:

嗨,Maurtis,我尝试了您发布的脚本。 我计算了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 中的错误(area1 = 104, area2 = 120, area3 = 117, area4 = 158, :Impossible: a17

a17 是什么?

【讨论】:

  • 该错误表明您在计算重叠时出错。您在之前的评论中链接到的表格对我来说看起来很奇怪。通常你会有一个二元矩阵(每组一列,每个观察的成员由0或1表示),或者一个集合元素列表。不确定您是如何计算重叠的,但显然这就是问题所在。
  • 感谢 Maurits,澄清一下.. 我的目的是绘制在 5 个不同地点采样的物种的重叠程度(?)。对于每个物种,5 个站点中的每个站点都会有许多目击事件(可以是 0,或者在我的情况下最多 16 个)。如果两个物种各有 8 次目击事件,我会说它们之间的重叠程度比它们都有 1 次的要高。我认为使用 0-1 / 二元矩阵会降低识别共享社区的分辨率。但也许我使用了错误的方法?
  • 请在下面查看我的更新答案。我认为对维恩图存在误解。我根据每个站点的物种的存在/不存在为您的数据显示 5 组维恩图。
【解决方案2】:

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

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

如果可以选择其他 R 包,这里有一个使用 VennDiagram 的 5 组示例(直接来自 VennDiagram reference manual

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 日]

您的源表采用非典型格式。正如我在我的 cmets 中解释的那样,您通常从 二进制矩阵(每组一列,每个观察的成员资格由 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    

观察是特定组(即采样点)。 目击次数在这里并不重要:维恩图探索在不同地点采样的不同物种之间的逻辑关系,或者换句话说,哪些独特的物种是由站点 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,它基于二进制矩阵计算所有重叠的计数。因此,如果您不想编写自己的函数(就像我一样),您也可以使用它们。无论哪种方式,对于更复杂的维恩图,我建议不要手动手动计算重叠,因为很容易出错(请参阅您的错误消息)。

【讨论】:

  • 是的,我仍然想绘制一个 5 集维恩。我更喜欢使用 venn 包,因为它看起来更容易并且视觉显示更好。我尝试了另一个包,但我在尝试计算所有重叠时迷失了方向。我不明白为什么它不会像在 venn 包中那样自行完成。我怎样才能在这里上传我的excel?
  • 我从来没有用过venn,所以我帮不了你。不确定“在尝试计算所有重叠时迷失方向”是什么意思。您需要以一种或另一种方式计算重叠(这应该是直截了当的)。如果您想增加获得帮助的机会,最好dput 一些示例数据并提供一个独立的最小可重复示例(至少直到您遇到困难为止)。请参阅here 获取建议。
  • 感谢您的回复。 VennDiagram 有这么多步骤,我没有到达我需要放入所有重叠值的位置(我不明白为什么需要它,如果我有每个站点的值行为什么不能计算它,我认为这就是 venn这样做是因为它全部在一个函数中完成 - 我只是不知道如何为它准备我的数据)。这是我的数据集:ufile.io/wje9r - 我把它上传到了uploadfiles.io 因为我看不到在哪里添加文件。
  • 您好 Maruitis,非常感谢您花时间编写脚本。我将用 R 运行它并玩弄。你说得对,我确实对维恩图有误解,我不知道每个“组”(即 A&B&C)只显示仅出现在该组中的独特元素,我认为它基本上显示了它们有多少共同元素不考虑其他组重叠。我实际上以与您描述的相同的方式创建了一个维恩图:bioinformatics.psb.ugent.be/cgi-bin/liste/Venn/… (ufile.io/z92st)
  • 我还使用 UpSetR - gehlenborglab.shinyapps.io/upsetr(在线应用程序)(ufile.io/pls8o)创建了一个群体共同拥有的物种丰富度的图表 - 我最初认为维恩图表显示,做你认为这个提议可以使用打乱者吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 2015-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多