[BioC] Venn Diagram
hpages at fhcrc.org
hpages at fhcrc.org
Thu Jul 2 06:41:25 CEST 2009
Oops, this is wrong, sorry! See a modified version of
makeVennTable() below that hopefully does the right thing.
Quoting Hervé Pagès <hpages at fhcrc.org>:
> Hi Simon,
>
> Simon Noël wrote:
>> Hello every one.
>>
>> I have ten list of between 4 to 3000 genes and I woudlike to put them all
>> together in a venn diagram.
>>
>> I have try to load the library ABarray and to use doVennDiagram but
>> it can only
>> une 3 list.
>>
>> Does any one know a way to put all of my ten list in the same venn diagram?
>
> A venn diagramm is a 2-D drawing of all the possible intersections
> between 2 or 3 sets where each set is represented by a simple 2-D
> shape (typically a circle). In the case of 3 sets, the resulting
> diagram defines a partitioning of the 2-D plane in 8 regions.
> Some people have tried (with more or less success) to put 4 sets on
> the diagram but then they need to use more complicated shapes and
> the resulting diagram is not as easy to read anymore. With 10 sets,
> you would end up with 1024 (2^10) regions in your drawing and you
> would need to use extremely complicated shapes for each region
> making it really hard to read! Maybe in that case it's easier
> to generate the table below.
>
> ## Let's say your genes are in 'set1', 'set2', etc... Put all the
> ## sets in a big list:
>
> mysets <- list(set1, set2, ..., set10)
>
> makeVennTable <- function(sets)
> {
> mkAllLogicalVect <- function(length)
> {
> if (length == 0L)
> return(logical(0))
> ans0 <- mkAllLogicalVect(length - 1L)
> ans1 <- cbind(TRUE, ans0)
> ans2 <- cbind(FALSE, ans0)
> rbind(ans1, ans2)
> }
> lm <- mkAllLogicalVect(length(sets))
> subsets <- apply(lm, MARGIN=1,
> function(ii)
> {
> s <- sets[ii]
> if (length(s) == 0)
> return("")
> paste(sort(unique(unlist(s))), collapse=",")
> })
> data.frame(lm, subsets)
> }
>
> Then call makeVennTable() on 'mysets'. For example, with 5 small sets:
>
> > mysets <- list(c(1,5,12,4,9,29),
> c(4,11,3,18),
> c(22,4,12,19,8),
> c(7,12,4,5,3),
> c(25,24,4,2))
>
> > makeVennTable(mysets)
> X1 X2 X3 X4 X5 subsets
> 1 TRUE TRUE TRUE TRUE TRUE 1,2,3,4,5,7,8,9,11,12,18,19,22,24,25,29
> 2 TRUE TRUE TRUE TRUE FALSE 1,3,4,5,7,8,9,11,12,18,19,22,29
> 3 TRUE TRUE TRUE FALSE TRUE 1,2,3,4,5,8,9,11,12,18,19,22,24,25,29
> 4 TRUE TRUE TRUE FALSE FALSE 1,3,4,5,8,9,11,12,18,19,22,29
> 5 TRUE TRUE FALSE TRUE TRUE 1,2,3,4,5,7,9,11,12,18,24,25,29
> 6 TRUE TRUE FALSE TRUE FALSE 1,3,4,5,7,9,11,12,18,29
> 7 TRUE TRUE FALSE FALSE TRUE 1,2,3,4,5,9,11,12,18,24,25,29
> 8 TRUE TRUE FALSE FALSE FALSE 1,3,4,5,9,11,12,18,29
> 9 TRUE FALSE TRUE TRUE TRUE 1,2,3,4,5,7,8,9,12,19,22,24,25,29
> 10 TRUE FALSE TRUE TRUE FALSE 1,3,4,5,7,8,9,12,19,22,29
> 11 TRUE FALSE TRUE FALSE TRUE 1,2,4,5,8,9,12,19,22,24,25,29
> 12 TRUE FALSE TRUE FALSE FALSE 1,4,5,8,9,12,19,22,29
> 13 TRUE FALSE FALSE TRUE TRUE 1,2,3,4,5,7,9,12,24,25,29
> 14 TRUE FALSE FALSE TRUE FALSE 1,3,4,5,7,9,12,29
> 15 TRUE FALSE FALSE FALSE TRUE 1,2,4,5,9,12,24,25,29
> 16 TRUE FALSE FALSE FALSE FALSE 1,4,5,9,12,29
> 17 FALSE TRUE TRUE TRUE TRUE 2,3,4,5,7,8,11,12,18,19,22,24,25
> 18 FALSE TRUE TRUE TRUE FALSE 3,4,5,7,8,11,12,18,19,22
> 19 FALSE TRUE TRUE FALSE TRUE 2,3,4,8,11,12,18,19,22,24,25
> 20 FALSE TRUE TRUE FALSE FALSE 3,4,8,11,12,18,19,22
> 21 FALSE TRUE FALSE TRUE TRUE 2,3,4,5,7,11,12,18,24,25
> 22 FALSE TRUE FALSE TRUE FALSE 3,4,5,7,11,12,18
> 23 FALSE TRUE FALSE FALSE TRUE 2,3,4,11,18,24,25
> 24 FALSE TRUE FALSE FALSE FALSE 3,4,11,18
> 25 FALSE FALSE TRUE TRUE TRUE 2,3,4,5,7,8,12,19,22,24,25
> 26 FALSE FALSE TRUE TRUE FALSE 3,4,5,7,8,12,19,22
> 27 FALSE FALSE TRUE FALSE TRUE 2,4,8,12,19,22,24,25
> 28 FALSE FALSE TRUE FALSE FALSE 4,8,12,19,22
> 29 FALSE FALSE FALSE TRUE TRUE 2,3,4,5,7,12,24,25
> 30 FALSE FALSE FALSE TRUE FALSE 3,4,5,7,12
> 31 FALSE FALSE FALSE FALSE TRUE 2,4,24,25
> 32 FALSE FALSE FALSE FALSE FALSE
The above table is clearly not the expected thing because the subsets
in the last column are not a partition of the initial set of genes
(some ids appear in several rows).
Try this instead:
makeVennTable <- function(sets)
{
mkAllLogicalVect <- function(length)
{
if (length == 0L)
return(logical(0))
ans0 <- mkAllLogicalVect(length - 1L)
ans1 <- cbind(TRUE, ans0)
ans2 <- cbind(FALSE, ans0)
rbind(ans1, ans2)
}
minter.int <- function(...)
{
args <- list(...)
if (length(args) == 0)
return(integer(0))
if (length(args) == 1)
return(args[[1]])
intersect(args[[1]], do.call(minter.int, args[-1]))
}
munion.int <- function(...)
{
unique(unlist(list(...)))
}
lm <- mkAllLogicalVect(length(sets))
parts <- apply(lm, MARGIN=1,
function(ii)
{
s1 <- do.call(minter.int, sets[ii])
s2 <- do.call(munion.int, sets[!ii])
part <- setdiff(s1, s2)
if (length(part) == 0)
return("")
paste(sort(part), collapse=",")
})
data.frame(lm, parts)
}
Then:
> makeVennTable(mysets)
X1 X2 X3 X4 X5 parts
1 TRUE TRUE TRUE TRUE TRUE 4
2 TRUE TRUE TRUE TRUE FALSE
3 TRUE TRUE TRUE FALSE TRUE
4 TRUE TRUE TRUE FALSE FALSE
5 TRUE TRUE FALSE TRUE TRUE
6 TRUE TRUE FALSE TRUE FALSE
7 TRUE TRUE FALSE FALSE TRUE
8 TRUE TRUE FALSE FALSE FALSE
9 TRUE FALSE TRUE TRUE TRUE
10 TRUE FALSE TRUE TRUE FALSE 12
11 TRUE FALSE TRUE FALSE TRUE
12 TRUE FALSE TRUE FALSE FALSE
13 TRUE FALSE FALSE TRUE TRUE
14 TRUE FALSE FALSE TRUE FALSE 5
15 TRUE FALSE FALSE FALSE TRUE
16 TRUE FALSE FALSE FALSE FALSE 1,9,29
17 FALSE TRUE TRUE TRUE TRUE
18 FALSE TRUE TRUE TRUE FALSE
19 FALSE TRUE TRUE FALSE TRUE
20 FALSE TRUE TRUE FALSE FALSE
21 FALSE TRUE FALSE TRUE TRUE
22 FALSE TRUE FALSE TRUE FALSE 3
23 FALSE TRUE FALSE FALSE TRUE
24 FALSE TRUE FALSE FALSE FALSE 11,18
25 FALSE FALSE TRUE TRUE TRUE
26 FALSE FALSE TRUE TRUE FALSE
27 FALSE FALSE TRUE FALSE TRUE
28 FALSE FALSE TRUE FALSE FALSE 8,19,22
29 FALSE FALSE FALSE TRUE TRUE
30 FALSE FALSE FALSE TRUE FALSE 7
31 FALSE FALSE FALSE FALSE TRUE 2,24,25
32 FALSE FALSE FALSE FALSE FALSE
H.
More information about the Bioconductor
mailing list