2013-10-19 82 views
3

我有三个ID列表。如何使用R绘制维恩图

我想比较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 
+0

的venneuler包应该能够帮助你;如果不是VennDiagram包是更可定制的。尽管如此,您很可能必须先计算出您感兴趣的比例。 –

+0

谢谢你,我已经尝试过没有结果。但是我没有看到任何好的例子来学习它。 – Jack

+1

现在你需要发布'dput(goterm1); dput(goterm2); dput(goterm2)' –

回答

6

您也可以用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

+1

来自CRAN的'limma'包似乎不适用于R 3.1.1,但我使用它来工作使用 'source(“http://bioconductor.org /biocLite.R“)' 'biocLite(”limma“)' – emudrak

2

这个答案使用dev version of qdaptrans_venn功能。这是对我的工作流程有意义的venneuler package的包装,但我认为可以在此应用。

安装dev version of 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

1

这可以使用我的[R包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