how to draw Venn Diagram using 6 sets

前端 未结 3 1570
闹比i
闹比i 2021-01-07 04:45

I have a dataset with 6 elements.

An I would like to draw a venn diagram, but with R (Venndiagram library) it\'s limited at 5 elements.

Do you know how can

相关标签:
3条回答
  • 2021-01-07 05:23

    Venn diagrams for more components (>5) can be constructed, but are so complicated that they are not useful any more, since they are very difficult to comprehend (see https://en.wikipedia.org/wiki/Venn_diagram for some examples of venn diagrams with e.g. 6 elements).

    UpSet package (http://www.caleydo.org/tools/upset/), which offers a different approach to visualizatioon of higher number of data sets might be more useful for such a task.

    0 讨论(0)
  • 2021-01-07 05:42

    Thanks @ben-frederickson for both the answer and your fine venn.js library. If the user would like to solve the problem in R with the new d3vennR htmlwidget, here is my answer. It is not the most efficient method, but it works.

    # 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 )
    
    0 讨论(0)
  • 2021-01-07 05:43

    I wrote a javascript library a while back that can do this: venn.js . It produces this output on the dataset you gave:

    Output on your data

    Its in javascript, but Kent Russell has provided a htmlwidgets interface to call it from R.

    Code to produce this is:

    // 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);
    
    0 讨论(0)
提交回复
热议问题