如何使用 6 组绘制维恩图
how to draw Venn Diagram using 6 sets
我有一个包含 6 个元素的数据集。
我想画维恩图,但使用 R(Venndiagram 库)它被限制在 5 个元素。
你知道怎么画6维维恩图吗?也许 python?
我的数据示例:
Ath,Fve,Mdm,Pcmm,Pper,Pmum,Counts
1,0,0,0,0,0,901
0,1,0,0,0,0,14764
0,0,1,0,0,0,19408
0,0,0,1,0,0,17714
0,0,0,0,1,0,16849
0,0,0,0,0,1,17572
1,1,0,0,0,0,823
1,0,1,0,0,0,846
...
我不久前写了一个 javascript 库可以做到这一点: venn.js 。它在您提供的数据集上生成此输出:
它在 javascript 中,但 Kent Russell 提供了一个 htmlwidgets interface to call it from R。
生成此代码的代码是:
// define set sizes and their intersection sizes
var sets = [
{sets: ['Ath'], size: 901},
{sets: ['Fve'], size: 14764},
{sets: ['Mdm'], size: 19408},
{sets: ['Pcmm'], size: 17714},
{sets: ['Pper'], size: 16948},
{sets: ['Pmum'], size: 17572},
{sets: ['Ath', 'Fve'], size: 823},
{sets: ['Ath', 'Mdm'], size: 846},
// need to specfiy the rest of the sets don't overlap
{sets: ['Ath', 'Pcmm'], size: 0},
{sets: ['Ath', 'Pper'], size: 0},
{sets: ['Ath', 'Pmum'], size: 0},
{sets: ['Fve', 'Mdm'], size: 0},
{sets: ['Fve', 'Pcmm'], size: 0},
{sets: ['Fve', 'Pper'], size: 0},
{sets: ['Fve', 'Pmum'], size: 0},
{sets: ['Mdm', 'Pcmm'], size: 0},
{sets: ['Mdm', 'Pper'], size: 0},
{sets: ['Mdm', 'Pmum'], size: 0},
{sets: ['Pcmm', 'Pper'], size: 0},
{sets: ['Pcmm', 'Pmum'], size: 0},
{sets: ['Pper', 'Pmum'], size: 0},
];
// draw the chart in the venn div
var chart = venn.VennDiagram();
d3.select("#venn").datum(sets).call(chart);
感谢@ben-frederickson 的回答和你的 venn.js 库。如果用户想用新的 d3vennR
htmlwidget 解决 R
中的问题,这是我的答案。这不是最有效的方法,但它有效。
# devtools::install_github("timelyportfolio/d3vennR")
library(d3vennR)
library(sets)
sets_df <- read.csv(
textConnection("Ath,Fve,Mdm,Pcmm,Pper,Pmum,Counts
1,0,0,0,0,0,901
0,1,0,0,0,0,14764
0,0,1,0,0,0,19408
0,0,0,1,0,0,17714
0,0,0,0,1,0,16849
0,0,0,0,0,1,17572
1,1,0,0,0,0,823
1,0,1,0,0,0,846"
)
)
# get all sets provided and their counts/size
sets_list <- apply(
sets_df
,MARGIN=1
,function(rw){
list(
sets = as.list(colnames(sets_df)[which(rw==1)])
, size = as.numeric(tail(rw,1))
)
}
)
# get all set combinations to fill with size = 0 where missing
sets_combinations <- lapply(
# answer by venn.js authors only goes to combinations of m=2
# this goes to combinations of m = sets - 1
seq.int(1,length(colnames(sets_df))-2)
,function(m){
t(combn(colnames(sets_df)[-length(colnames(sets_df))],m=m))
}
)
# now combine the sets and sizes provided in data with the sets and 0
sets_venn <- unlist(
lapply(
sets_combinations
,function(x){
apply(
x
,MARGIN=1
,function(y){
# this gets sets of 0 which are not in the data provided
if(!set_contains_element(
as.set(lapply(sets_list,function(z){as.set(unlist(z$sets))}))
,as.set(y)
)){
list(sets=y,size=0)
} else {
# this gets sets with their sizes given by the partial data provided
unlist(
Filter(
function(z){
set_is_equal(as.set(y),as.set(unlist(z$sets)))
}
,sets_list
)
,recursive=F
)
}
}
)
}
)
,recursive=F
)
# produce the Venn Diagram in R with the transformed data
d3vennR( data = sets_venn )
可以构建更多组件 (>5) 的维恩图,但过于复杂以至于它们不再有用,因为它们很难理解(请参阅 https://en.wikipedia.org/wiki/Venn_diagram 一些维恩图示例例如 6 个元素)。
UpSet 包 (http://www.caleydo.org/tools/upset/),它提供了一种不同的方法来可视化更多的数据集,可能对此类任务更有用。
我有一个包含 6 个元素的数据集。
我想画维恩图,但使用 R(Venndiagram 库)它被限制在 5 个元素。
你知道怎么画6维维恩图吗?也许 python?
我的数据示例:
Ath,Fve,Mdm,Pcmm,Pper,Pmum,Counts
1,0,0,0,0,0,901
0,1,0,0,0,0,14764
0,0,1,0,0,0,19408
0,0,0,1,0,0,17714
0,0,0,0,1,0,16849
0,0,0,0,0,1,17572
1,1,0,0,0,0,823
1,0,1,0,0,0,846
...
我不久前写了一个 javascript 库可以做到这一点: venn.js 。它在您提供的数据集上生成此输出:
它在 javascript 中,但 Kent Russell 提供了一个 htmlwidgets interface to call it from R。
生成此代码的代码是:
// define set sizes and their intersection sizes
var sets = [
{sets: ['Ath'], size: 901},
{sets: ['Fve'], size: 14764},
{sets: ['Mdm'], size: 19408},
{sets: ['Pcmm'], size: 17714},
{sets: ['Pper'], size: 16948},
{sets: ['Pmum'], size: 17572},
{sets: ['Ath', 'Fve'], size: 823},
{sets: ['Ath', 'Mdm'], size: 846},
// need to specfiy the rest of the sets don't overlap
{sets: ['Ath', 'Pcmm'], size: 0},
{sets: ['Ath', 'Pper'], size: 0},
{sets: ['Ath', 'Pmum'], size: 0},
{sets: ['Fve', 'Mdm'], size: 0},
{sets: ['Fve', 'Pcmm'], size: 0},
{sets: ['Fve', 'Pper'], size: 0},
{sets: ['Fve', 'Pmum'], size: 0},
{sets: ['Mdm', 'Pcmm'], size: 0},
{sets: ['Mdm', 'Pper'], size: 0},
{sets: ['Mdm', 'Pmum'], size: 0},
{sets: ['Pcmm', 'Pper'], size: 0},
{sets: ['Pcmm', 'Pmum'], size: 0},
{sets: ['Pper', 'Pmum'], size: 0},
];
// draw the chart in the venn div
var chart = venn.VennDiagram();
d3.select("#venn").datum(sets).call(chart);
感谢@ben-frederickson 的回答和你的 venn.js 库。如果用户想用新的 d3vennR
htmlwidget 解决 R
中的问题,这是我的答案。这不是最有效的方法,但它有效。
# devtools::install_github("timelyportfolio/d3vennR")
library(d3vennR)
library(sets)
sets_df <- read.csv(
textConnection("Ath,Fve,Mdm,Pcmm,Pper,Pmum,Counts
1,0,0,0,0,0,901
0,1,0,0,0,0,14764
0,0,1,0,0,0,19408
0,0,0,1,0,0,17714
0,0,0,0,1,0,16849
0,0,0,0,0,1,17572
1,1,0,0,0,0,823
1,0,1,0,0,0,846"
)
)
# get all sets provided and their counts/size
sets_list <- apply(
sets_df
,MARGIN=1
,function(rw){
list(
sets = as.list(colnames(sets_df)[which(rw==1)])
, size = as.numeric(tail(rw,1))
)
}
)
# get all set combinations to fill with size = 0 where missing
sets_combinations <- lapply(
# answer by venn.js authors only goes to combinations of m=2
# this goes to combinations of m = sets - 1
seq.int(1,length(colnames(sets_df))-2)
,function(m){
t(combn(colnames(sets_df)[-length(colnames(sets_df))],m=m))
}
)
# now combine the sets and sizes provided in data with the sets and 0
sets_venn <- unlist(
lapply(
sets_combinations
,function(x){
apply(
x
,MARGIN=1
,function(y){
# this gets sets of 0 which are not in the data provided
if(!set_contains_element(
as.set(lapply(sets_list,function(z){as.set(unlist(z$sets))}))
,as.set(y)
)){
list(sets=y,size=0)
} else {
# this gets sets with their sizes given by the partial data provided
unlist(
Filter(
function(z){
set_is_equal(as.set(y),as.set(unlist(z$sets)))
}
,sets_list
)
,recursive=F
)
}
}
)
}
)
,recursive=F
)
# produce the Venn Diagram in R with the transformed data
d3vennR( data = sets_venn )
可以构建更多组件 (>5) 的维恩图,但过于复杂以至于它们不再有用,因为它们很难理解(请参阅 https://en.wikipedia.org/wiki/Venn_diagram 一些维恩图示例例如 6 个元素)。
UpSet 包 (http://www.caleydo.org/tools/upset/),它提供了一种不同的方法来可视化更多的数据集,可能对此类任务更有用。