繁体   English   中英

从R中的CSV文件创建5路维恩图

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM