2013-10-19 152 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