【问题标题】:Nice looking five sets Venn diagrams in R [closed]R中看起来很漂亮的五组维恩图[关闭]
【发布时间】:2015-12-03 02:17:41
【问题描述】:

我最近在一篇论文中发现了一个不错的 5 组维恩图:

有人知道如何在 R 中编写生成这种维恩图显示的代码吗?

我查看的大多数软件包似乎都产生了不太清晰的版本

有什么想法吗?

编辑:Nature 文章似乎使用了这个网络工具: http://bioinformatics.psb.ugent.be/webtools/Venn/ 将它移植到某些 R 包可能仍然很好,尤其是不对称的 Venns,目前在我所知道的任何包中都不可用

【问题讨论】:

  • 你检查Venn Diagrams with R中的包了吗?
  • 是的,我尝试了所有这些!但他们只能生产底部的无花果,不能生产顶部的无花果!还有一些限制在 4 套或更少的套...

标签: r graphics venn-diagram


【解决方案1】:

如果有五个类别,请不要使用维恩图,因为它对读者的眼睛来说太复杂了。试试这样的:https://github.com/const-ae/ggupset

【讨论】:

    【解决方案2】:

    也许您可以尝试使用 VennDetail,它不仅可以帮助您生成 venndiagram,还可以为您提供生成“vennpie”图形的选项。您还可以根据图形轻松提取每个子集。

    【讨论】:

      【解决方案3】:

      为了记录,Adrian Dusa 制作了一个非常不错的新 R 包venn,它可以制作如上所示的维恩图,最多 7 组:

      library(venn)
      venn(5, ilab=TRUE, zcolor = "style")
      

      venn(7, ilab=TRUE, zcolor = "style")
      

      感谢 Adrian 提供的酷包!

      【讨论】:

        【解决方案4】:
        library(venn); library(tidyverse); library(stringr); 
        
        p_th = 0.0;
        
        data <- read_csv("finaldf.csv")
        data
        
        venn = 
          list(A = 
             data %>% 
             filter(CVA > p_th) %>% 
             .$phrase,
           B = 
             data %>% 
             filter(IHD > p_th) %>% 
             .$phrase,
           C = 
             data %>% 
             filter(CM > p_th) %>% 
             .$phrase,
           D = 
             data %>% 
             filter(ARR > p_th) %>% 
             .$phrase,
           E = 
             data %>% 
             filter(VD > p_th) %>% 
             .$phrase,
           G = 
             data %>% 
             filter(CHD > p_th) %>% 
             .$phrase);
        
        png("ven.png", width = 800, height = 800)
        
        venn.result =
          venn(venn, ilabels = TRUE, 
               zcolor = "style", size = 25, cexil = 1.2, cexsn = 1.5);
        
        
        dev.off()
        

        6组维恩图

        【讨论】:

        • 这看起来很棒。感谢分享!您可以通过在答案中添加 dput(data) 来使其更有用和可重复吗?
        • @Dibakar final_df.csv 看起来怎么样
        【解决方案5】:

        我还在根特大学生物信息学网站上使用了在线维恩图生成器,并且想要自己的功能。当然,这个想法是使每个交叉区域的大小合理,以便计数的文本都可以是相同的大小。这是我的尝试:

        fiveCellVenn <- function(colorList=col2rgb(rainbow(5)),
                                 cellCounts=seq(1,31,1),
                                 cellLabels=c("one","two","three","four","five"),
                                 saturation=.25){
          rotateVec <-function(vec,amount){
            return(c(vec[(amount+1):length(vec)], vec[1:amount]))
          }
          n=70
          xhull <- c()
          yhull <- c()
          for (i in 1:n){
            xhull <- c(xhull, cos((i*2*pi)/n))
            yhull <- c(yhull, sin((i*2*pi)/n))
          }
        ## The Venn cells begin as a 70-sided regular polygon
        ## plot(xhull, yhull)
        ## polygon(xhull, yhull)
        ## Multiply each unit vector in the hull by a scalar, arrived at by 
        ## iterative adjustment.
          adjust <-c(10,10.35,10.6,10.5,10.4,10.3,10.1,9.6,9,8.5,
                     8,7.625,7.25,7.125,7,6.875,6.75,6.875,7,7.125,
                     7.25,7.625,8.1,9.125,10.25,11.375,12.5,13.15,13.8,14.3,
                     14.6,14.725,14.7,14.7,14.7,14.4,14.1,13.8,13.5,12.8,
                     12.1,11.15,10.2,9.6,8.95,8.3,7.7,7,6.25,5.6,
                     5,4.75,4.5,4.25,4,3.8,3.6,3.45,3.45,3.45,
                     3.5,3.625,3.75,3.825,4,4.25,4.5,5.75,7.25,8.5)
          newxhull <- xhull*adjust
          newyhull <- yhull*adjust
        ## Text location was also done by hand:
          textLocationX <- c(-13,-3,8,9,-4,-7.5,7.5,-9,-8,4,6.5,-2,9,-4,1.4,4,-7.5,-3.5,7.5,-6,-6.5,6,1.5,4,-0.5,4.5,0,-5,-3.5,3.5,0)
          textLocationY <- c(1,12,8,-8,-12,6.5,4.5,1,-4,8.5,-6,8.5,-1.5,-8,-9,5,3.5,6,1.5,-6,-1.5,-2,8,-7,-6.5,2,5.5,2,-3.5,-4,0)
          textLocationMatrix <- matrix(cbind(textLocationX,textLocationY),nrow=31,ncol=2)
          plot(newxhull, newyhull, pch=".", xlim=c(-16,16), ylim=c(-16,16),
               axes=FALSE,xlab="",ylab="")
          newAdjust<-adjust
          for (i in 1:5){
            newxhull <- xhull*newAdjust
            newyhull <- yhull*newAdjust
            polygon(newxhull, newyhull, 
                    border=rgb(colorList[1,i]/255, colorList[2,i]/255, colorList[3,i]/255, 1),
                    lwd=2,
                    col=rgb(colorList[1,i]/255, colorList[2,i]/255, colorList[3,i]/255,saturation))
            newAdjust <- rotateVec(newAdjust,14)
          }
          text(textLocationMatrix[,1], textLocationMatrix[,2],labels=as.character(cellCounts))
          text(textLocationMatrix[c(17,2,3,24,14),1]*c(2,1.25,1.5,2,2),
               textLocationMatrix[c(17,2,3,24,14),2]*c(2,1.35,1.5,2,2),
               labels=cellLabels)
        ##  uncomment and run to get points and grid for adjusting text location
        ##  points(textLocationMatrix[,1], textLocationMatrix[,2])
        ##  for (i in -16:16){
        ##   if (i%%5==0){
        ##     color="black"
        ##   }else{
        ##     color="lightblue"
        ##   }
        ##  abline(v=i,col=color)
        ##  abline(h=i, col=color)
        ##  }
        }
        

        然后

        fiveCellVenn()
        

        产生与您的第一个相似的维恩。我还没有代表发布图片。您可能想要淡化颜色并移动单元格名称。

        【讨论】:

        • 非常好!非常感谢 - 看起来很棒!您还可以考虑稍微平滑多边形以使它们看起来更好,如gis.stackexchange.com/questions/24827/… 也可以很好地推广到其他 nrs 集合。也许与其中一个维恩图 R 包取得联系——他们可能有兴趣包含这个!
        • 与上面链接中的 spline.poly() 函数沿着 plot(newxhull,newyhull);多边形(spline.poly(as.data.frame(list(x=newxhull,y=newyhull))[-seq(1, length(newxhull), by = 2),],100,k=3)) 可能是用于平滑多边形一点
        猜你喜欢
        • 2013-11-17
        • 2020-06-20
        • 1970-01-01
        • 1970-01-01
        • 2015-11-16
        • 2023-03-23
        • 2010-11-28
        • 1970-01-01
        相关资源
        最近更新 更多