[英]Create 5 way Venn Diagram from CSV file in R
我从一项调查的结果中获得了答案,人们回答了5个问题,1 =是0 =否,他们是如何形容自己的,CRAFTSPERSON DESIGNER FABRICATOR FINE ARTIST OTHER OTHER。
我正在尝试看看人们如何识别身份。 我想以维恩图的形式获取信息。 我发现要做的大多数事情都向我展示了如何获得每个部分,例如。 n1,n2,... n12345,然后使用draw.quintuplet.venn绘制该图,因为我尝试查看20个部分,看是否有更简单的方法,而不必将代码重复20次略微调整。
我已经安装了venndiagram软件包,但正在努力使用5个部分来使用它。 使用venn.diagram,但不确定在括号中输入什么。
数据看起来大约下降了300行(对齐方式略有偏离,但每个标头都带有一列)
CRAFTSPERSON设计师制作者精细艺术家其他
0 1 0 0 1 1
1 1 0 0 0 1
0 0 0 0 0 1
0 0 0 0 1 1
谢谢
使用VennDiagram库,需要定义每个集合的交集。 我同意这可能很麻烦。 我最近遇到图书馆eulerr。 除此之外,该程序包试图使设置/交叉区域与计数成比例。
这是一个包含4组的示例:
首先一些数据:
set.seed(2)
df = data.frame(A = sample(c(0, 1), 100, replace = T),
B = sample(c(0, 1), 100, replace = T),
C = sample(c(0, 1), 100, replace = T),
D = sample(c(0, 1), 100, replace = T))
library("eulerr")
set.seed(10) #this seed changes the orientation of the sets
plot(euler(df), counts = T, fontface = 1)
您也可以通过维恩图的方式来做到这一点:
set.seed(10)
sp_euler = with(df,
euler(c("A" = sum(A),
"B" = sum(B),
"C" = sum(C),
"D" = sum(D),
"A&B" = sum(A == 1 & B == 1),
"A&C" = sum(A == 1 & C == 1),
"A&D" = sum(A == 1 & D == 1),
"B&C" = sum(B == 1 & C == 1),
"B&D" = sum(B == 1 & D == 1),
"C&D" = sum(C == 1 & D == 1),
"A&B&C" = sum(A == 1 & B == 1 & C == 1),
"A&B&D" = sum(A == 1 & B == 1 & D == 1),
"A&C&D" = sum(A == 1 & C == 1 & D == 1),
"B&C&D" = sum(B == 1 & C == 1 & D == 1),
"A&B&C&D" = sum(A == 1 & B == 1 & C == 1 & D == 1)), input = "union"))
plot(sp_euler, counts = T, fontface = 1)
5套:
set.seed(2)
df = data.frame(A = sample(c(0, 1), 100, replace = T),
B = sample(c(0, 1), 100, replace = T),
C = sample(c(0, 1), 100, replace = T),
D = sample(c(0, 1), 100, replace = T),
E = sample(c(0, 1), 100, replace = T))
set.seed(10)
plot(euler(df), counts = T, fontface = 1)
但是,这可能不适用于所有集合,因为如果欧拉模型无法描述所有交叉点,则不会绘制计数。 例如,在4组示例中,B和D的交点是5,而不是0,就像可以从图中得出的结论:
set.seed(2)
df = data.frame(A = sample(c(0, 1), 100, replace = T),
B = sample(c(0, 1), 100, replace = T),
C = sample(c(0, 1), 100, replace = T),
D = sample(c(0, 1), 100, replace = T))
eu_model = euler(df)
eu_model
#output:
original fitted residuals region_error
A 5 5.022 -0.022 0.023
B 5 5.000 0.000 0.023
C 8 8.004 -0.004 0.037
D 7 7.012 -0.012 0.033
A&B 6 0.000 6.000 0.065
A&C 5 4.985 0.015 0.023
A&D 9 8.978 0.022 0.041
B&C 11 11.004 -0.004 0.051
B&D 5 0.000 5.000 0.054
C&D 6 0.000 6.000 0.065
A&B&C 8 7.985 0.015 0.037
A&B&D 4 0.000 4.000 0.043
A&C&D 7 7.018 -0.018 0.033
B&C&D 6 0.000 6.000 0.065
A&B&C&D 1 0.000 1.000 0.011
diag_error: 0.065
stress: 0.23
另一种选择是limma
library(limma) # part of bioconductor
安装:
source("http://www.bioconductor.org/biocLite.R")
biocLite("limma")
library(limma)
绘制:
vennDiagram(vennCounts(df), circle.col = 1:5)
虽然不是最简单的方法,但我的nVennR软件包可能会有所帮助:
library(nVennR)
df = data.frame(A = sample(c(0, 1), 100, replace = T),
B = sample(c(0, 1), 100, replace = T),
C = sample(c(0, 1), 100, replace = T),
D = sample(c(0, 1), 100, replace = T),
E = sample(c(0, 1), 100, replace = T))
fromBin <- function(binList){
result <- 0
for (b in binList){
result <- bitwShiftL(result, 1)
result <- result + b
}
return(result)
}
interpretBin <- function(dff){
nels <- bitwShiftL(1, ncol(dff))
result <- vector(mode='numeric', length=nels)
for (r in rownames(dff)){
n <- fromBin(dff[r,]) + 1
result[n] <- result[n] + 1
}
return(result)
}
regs <- interpretBin(df)
myV <- createVennObj(nSets = ncol(df), sNames = colnames(df), sSizes = regs)
myV <- plotVenn(nVennObj = myV)
myV <- plotVenn(nVennObj = myV)
在这种情况下,重要的是两次运行最后一个命令,如图所示。 第一次运行的结果未压缩。 在第二次运行之后,
这里的想法是二进制链与包内部使用的策略相同,如您在插图中所看到的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.