【问题标题】:Transforming data to create generalized, quasi-proportional Venn diagrams using Package ‘nVennR’使用包“nVennR”转换数据以创建通用的准比例维恩图
【发布时间】:2018-03-25 01:06:17
【问题描述】:

我有以下数据集,希望您能帮助对其进行转换,以便能够使用Package ‘nVennR’ by Pérez-Silva et al. 2018 绘制维恩图。

这是数据集:

dput(data)
structure(list(Employee = c("A001", "A002", "A003", "A004", "A005", 
"A006", "A007", "A008", "A009", "A010", "A011", "A012", "A013", 
"A014", "A015", "A016", "A017", "A018"), SAS = c("Y", "N", "Y", 
"Y", "Y", "Y", "N", "Y", "N", "N", "Y", "Y", "Y", "Y", "N", "N", 
"N", "N"), Python = c("Y", "Y", "Y", "Y", "N", "N", "N", "N", 
"N", "N", "Y", "Y", "N", "N", "N", "N", "Y", "Y"), R = c("Y", 
"Y", "N", "Y", "N", "Y", "N", "N", "Y", "Y", "Y", "Y", "Y", "Y", 
"Y", "Y", "N", "N")), .Names = c("Employee", "SAS", "Python", 
"R"), row.names = c(NA, -18L), class = c("tbl_df", "tbl", "data.frame"
))

请看下面我想得到的维恩图示例:

更新:

安装nVennRrsvg 的更新版本后,当我从here 运行示例代码时,我得到错误和下图:

Warning message:
In checkValidSVG(doc, warn = warn) :
This picture was not generated by the 'grConvert' package, errors may result

以下是我的会话信息:

sessionInfo()
R version 3.4.2 (2017-09-28)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows >= 8 x64 (build 9200)

Matrix products: default

locale:
[1] LC_COLLATE=English_United States.1252 
[2] LC_CTYPE=English_United States.1252   
[3] LC_MONETARY=English_United States.1252
[4] LC_NUMERIC=C                          
[5] LC_TIME=English_United States.1252    

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods  
[7] base     

other attached packages:
[1] nVennR_0.2.0

loaded via a namespace (and not attached):
 [1] Rcpp_0.12.16       lattice_0.20-35    XML_3.98-1.10     
 [4] png_0.1-7          rsvg_1.1           grid_3.4.2        
 [7] plyr_1.8.4         gtable_0.2.0       scales_0.5.0.9000 
[10] ggplot2_2.2.1.9000 pillar_1.2.1       rlang_0.2.0.9001  
[13] grImport2_0.1-2    lazyeval_0.2.1     Matrix_1.2-12     
[16] tools_3.4.2        munsell_0.4.3      jpeg_0.1-8        
[19] compiler_3.4.2     base64enc_0.1-3    colorspace_1.3-2  
[22] tibble_1.4.2

如果有任何解决此问题的想法,我将不胜感激。

【问题讨论】:

    标签: r algorithm venn-diagram


    【解决方案1】:

    这是使用Bioconductor 中的limma 包的一种方法,您的数据从dput 作为变量z 加载:

    source("http://www.bioconductor.org/biocLite.R")
    biocLite("limma")
    library(limma)
    

    将所有 Y 更改为 TRUE,将所有 N 更改为 FALSE:

    z2 <- data.frame(lapply(z, function(x) { gsub("Y", "TRUE", x) }))
    z3 <- data.frame(lapply(z2, function(x) { gsub("N", "FALSE", x) }),stringsAsFactors=FALSE)
    

    确保它们都是逻辑类型:

    z3$SAS <- as.logical(z3$SAS)
    z3$Python <- as.logical(z3$Python)
    z3$R <- as.logical(z3$R)
    

    现在使用vennCounts 统计每个维恩地区的所有总数:

    > ( venn.totals <- vennCounts(z3[,-1]) )
      SAS Python R Counts
    1   0      0 0      1
    2   0      0 1      4
    3   0      1 0      2
    4   0      1 1      1
    5   1      0 0      2
    6   1      0 1      3
    7   1      1 0      1
    8   1      1 1      4
    attr(,"class")
    [1] "VennCounts"
    

    制作图表只是又一步:

    vennDiagram(venn.totals)
    

    【讨论】:

    • 谢谢,@mysteRious。但如果原始数据集中这些变量的值等于TRUE 或@ 987654336@。想法是将数据集转换为sets of lists,可以由nVennRVennDiagram 处理。
    • 我尝试使用nVennR,它非常挑剔.. 它不会接受列表列表,这可能是您遇到的问题。如果您查看toVenn 的代码,它会列出 for 您的列表,这可能是主要问题。强烈建议不要使用花哨的彩色维恩图……nVennR 的输出真的很难解释。
    【解决方案2】:

    只是一个简短的说明,让您知道新版本的 nVennR 已准备就绪。输入和输出控制现在不同了,toVenn 已弃用,将由plotVenn 代替。有一个带有几个示例的小插图,其中一个使用了这个问题中的数据,here

    【讨论】:

    • 嗨,@vqf。感谢您为更新这个优秀的软件包付出了巨大的努力。只有一个问题:当我从here 运行示例代码时,我收到此警告:Warning message: In checkValidSVG(doc, warn = warn) : This picture was not generated by the 'grConvert' package, errors may result,并且根据its author'grConvert' package 目前不适用于 Windows。另外,维恩图显示不好。你能解决这个问题吗?
    • 是的,nVennR 使用rsvg 而不是grConvert,但我从未见过任何警告。您能否尝试在您的环境中更新rsvg?让我知道这是否能解决问题。如果这样可以解决问题,在未来的版本中,我必须确保提供每个依赖项的最小版本。
    • 从你显示的图片来看,图表是正确的。唯一的问题是绘图框的图像质量很差。但是,底层图片是矢量的,并且可以更改分辨率。如果将结果导出为 pdf,您会发现该图的更好版本。如果将其导出为位图(即 png),请确保设置宽度和高度以获得良好的分辨率(例如,3200x1989)。我正在做一个笔记来研究如何操纵绘图窗口的分辨率。
    【解决方案3】:

    很高兴这么快就有反馈。也许我们应该在文档中说明这个版本的 nVennR 是初步的。一些研究人员要求快速运行 nVenn,所以我只是将 C++ 代码包装到几个 R 函数中。如您所见,结果显示在viewer 窗口中,而不是plot 窗口中。我边走边学。 由于我看到了对这个包的一些兴趣,我正在编译一个功能列表以添加到下一个版本。更好的输入选项肯定在该列表中。另外,对输出有更多的控制(顺便说一句,如果颜色有问题,你可以将opacity设置为0)。

    关于这个问题,@mysteRious 是对的,您将列表发送到函数。一个快速的方法是

    sas <- subset(data, SAS == "Y")$Employee
    python <- subset(data, Python == "Y")$Employee
    rr <- subset(data, R == "Y")$Employee
    mySVG <- toVenn(sas, python, rr)
    showSVG(mySVG = mySVG, opacity = 0.1)
    

    下个版本会有单独输入名字的方法(抱歉)

    【讨论】:

    • 感谢您的包裹,@vqf。它能够提供具有视觉吸引力的维恩图,同时能够说明细节,使其成为我研究的宝贵工具。当然,添加更多功能以提供更大的灵活性会非常有帮助。特别是,您的代码在这里解决了我的问题,但您能否提供更多关于如何更改标签name1name2name3 以及123 的提示,分别在图例和情节中?
    【解决方案4】:

    关于标签,简短的回答是您可以使用 SVG 编辑器(例如 Inkscape)自己编辑它们。如果您已安装它,您可以通过运行showSVG(mySVG = mySVG, opacity = 0.1, systemShow=T) 在编辑器中打开该图。您还可以通过提供输出文件 (outFile) 来保存图形,或者只打开生成的临时文件。

    稍长一点的答案是 name1, name2,... 可以替换为列表的名称。不幸的是,由于我对 R 的限制,我没有意识到这可能并不简单。将每个变量加载为表格并设置 colNames 会更容易。例如,

    sas <- as.table(subset(data, SAS == "Y")$Employee)
    names(sas) <- 'SAS'
    

    该标签将用于图例。关于小标签,目前用户无法更改。这些是为了帮助读取特定区域的位置,当这些区域很小时,使用更长的标签似乎不可行。我的建议是始终使用外部编辑器来更改它们。未来的版本将至少能够删除这些标签,就像在 Web 版本中一样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-14
      相关资源
      最近更新 更多