首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >维恩图5路(用' venn‘R)

维恩图5路(用' venn‘R)
EN

Stack Overflow用户
提问于 2017-11-13 08:35:24
回答 2查看 6.3K关注 0票数 0

首先,我想为我的基本问题道歉。我确信,如果我是一个经验丰富的用户,在这个主题上的其他线程将是令人满意的,但我无法管理,即使是在阅读他们。所以如果这可能会惹恼你,欢迎你忽略。

对于那些仍然想要帮助的人:我正在尝试创建一个5路venn图。我的数据以excel格式排列为5列(每个列代表一个站点the ),每个列代表5个站点的物种丰富度(0-16)。

我想要创建一个很好的venn图,类似于这样:https://i.stack.imgur.com/TeRSJ.png

我相信它只需点击几下就可以了。但是我无法做到:以写的方式加载我的数据--它应该是哪种格式?数据集?名单?矩阵?

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

最后,我想我会使用这个命令,并将x作为我的数据

代码语言:javascript
复制
venn(x, snames = c(""), ilabels = FALSE, counts = FALSE, zcolor = c("bw"),
transparency = 0.3, ellipse = FALSE, size = 15, cexil = 0.45, cexsn = 0.85, 
...)

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

提前感谢

EN

回答 2

Stack Overflow用户

发布于 2017-11-13 08:53:21

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

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

如果其他R包是一个选项,下面是一个使用VennDiagram (直接来自VennDiagram参考手册)的经过改进的5集示例

代码语言:javascript
复制
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所指示的每个观察的成员资格)或set元素列表开始。

老实说,我越来越不确定你到底想做什么。我有一种感觉,可能会对文恩图产生误解。例如,让我们看一看表的第一行

代码语言:javascript
复制
# 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组Venn图中显示不同站点之间的重叠。我首先定义一个帮助函数cts来计算每个组/重叠的计数,然后将这些数字输入draw.quintuple.venn

代码语言:javascript
复制
# 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包/internet源提供基于例如二进制矩阵或集合元素列表来计算重叠的辅助功能。例如,R/生物导体包limma提供了一个基于二进制矩阵计算所有重叠计数的函数limma::vennCounts。因此,如果您不想编写自己的函数(就像我一样),您也可以使用这些函数。无论哪种方法,对于更复杂的Venn图,我建议不要手工计算重叠,因为这很容易出错(见您的错误消息)。

票数 0
EN

Stack Overflow用户

发布于 2017-11-13 21:19:55

你好,莫蒂斯,我试过你发的剧本。我计算了excel中的重叠,最终得到:

代码语言:javascript
复制
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 ):不可能: a17 <- n135 - a27 - a29 - a31产生负区域

哪个是a17?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47259980

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档