如何使用R绘制Venn图

4

我有三个ID列表。

我想比较这3个列表,并绘制一个维恩图。在所得到的维恩图中,我想要显示交集中的不是数字而是ID。 我需要在R中完成这个任务,但我真的不知道该怎么做。 你能帮助我吗? 这是我的代码。它可以工作,但只显示数字,我想要在交叉点上显示“术语”。

       set1 <- unique(goterm1)
       set2 <- unique(goterm2)
        set3 <- unique(goterm3)

       require(limma)
       Diagram <- function(set1, set2, set3, names)
       {
     stopifnot( length(names) == 3)
      # Form universe as union of all three sets
      universe <- sort( unique( c(set1, set2, set3) ) )
      Counts <- matrix(0, nrow=length(universe), ncol=3)
      colnames(Counts) <- names
        for (i in 1:length(universe))
        {
        Counts[i,1] <- universe[i] %in% set1
        Counts[i,2] <- universe[i] %in% set2
       Counts[i,3] <- universe[i] %in% set3
       }

         vennDiagram( vennCounts(Counts) )}

       Diagram(set1, set2, set3, c("ORG1", "ORG2", "ORG3"))
        Venn

venneuler包应该能够帮助您;如果不能,则VennDiagram包更具可定制性。不过,您很可能需要事先确定您感兴趣的比例。 - Twitch_City
谢谢,我已经尝试了两种方法,但都没有结果。然而,我还没有看到任何好的例子来学习它。 - Jack
1
现在您需要发布 dput(goterm1) ; dput(goterm2);dput(goterm2) - IRTFM
3个回答

8
您也可以使用limma来完成这个任务。请看下面的示例。
基本思路与您发布的代码完全相同,但它没有被封装成一个函数(因此可能更容易调试)。
您是否通过下面的代码来完成任务?如果没有,请发布可能收到的错误消息和警告。
# Load the library
library(limma)

# Generate example data
set1<-letters[1:5]
set2<-letters[4:8]
set3<-letters[5:9]

# What are the possible letters in the universe?
universe <- sort(unique(c(set1, set2, set3)))

# Generate a matrix, with the sets in columns and possible letters on rows
Counts <- matrix(0, nrow=length(universe), ncol=3)
# Populate the said matrix
for (i in 1:length(universe)) {
   Counts[i,1] <- universe[i] %in% set1
   Counts[i,2] <- universe[i] %in% set2
   Counts[i,3] <- universe[i] %in% set3
}

# Name the columns with the sample names
colnames(Counts) <- c("set1","set2","set3")

# Specify the colors for the sets
cols<-c("Red", "Green", "Blue")
vennDiagram(vennCounts(Counts), circle.col=cols)

代码应该生成类似于以下图片的绘图结果:

enter image description here


2
CRAN中的limma包似乎无法与R 3.1.1一起使用,但我使用以下命令使其正常工作:`source("http://bioconductor.org/biocLite.R")` `biocLite("limma")` - emudrak

4
这可以使用我的r包eulerr来完成,如下所示:

eulerr


set1 <- letters[1:5]
set2 <- letters[4:8]
set3 <- letters[5:9]

library(eulerr)

plot(euler(list(A = set1, B = set2, C = set3)))

Imgur


这个函数看起来非常好用,但用户无法设置圆圈的颜色 :( - Ilona
更新:可以设置颜色:plot(euler(list(A = set1, B = set2, C = set3)), fills = c("红色", "蓝色", "绿色"))。 - Ilona

2
这个答案使用了 qdap的开发版本trans_venn函数。这是 venneuler包的一个包装器,它在我的工作流程中很有意义,但我认为它也可以应用于这里。
安装 qdap的开发版本
library(devtools)
install_github("qdapDictionaries", "trinker")
install_github("qdap", "trinker")

将其应用于您的数据:
set1 <- letters[1:5]
set2 <- letters[4:8]
set3 <- letters[5:9]

## reshapes the list of vectors to a data frame (unique is not needed)
dat <- list2df(list(set1 = set1, set2 = set2, set3 = set3), "word", "set")
trans_venn(dat$word, dat$set)

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接