2013-02-08 2 views
1

У меня есть эти данные:Многомерные Венна Диаграммы

String[] a = {"a", "b", "c", "d"}; 
String[] b = {"c", "d"}; 
String[] c = {"b", "c"}; 

Теперь мне нужно графическое представление каждого пересечения этих списков, в основном, это приведет к Венна диаграмме, как это: http://manuals.bioinformatics.ucr.edu/_/rsrc/1353282523430/home/R_BioCondManual/r-bioc-temp/venn1.png?height=291&width=400

В моей реализация этих списков будет в основном содержать более 1000 записей, и у меня будет 10 + списков, поэтому хорошее представление создаст набор строк и пересечет их. в моем очень простом случае это будет приводить к

set_a = {"c"};  // in all three lists 
set_b = {"b", "d"}; // in two of three lists 
set_c = {"a"};  // in one of three lists 

другое требование теперь, что размер пересечения должны быть пропорциональны вхождений в списках. поэтому размер set_a должен быть в 3 раза больше, чем set_c.

Есть ли какой-либо lib для этого требования?

+0

http://stackoverflow.com/questions/11697196/draw-venn-diagram-using-java –

+0

Возможно, set b будет 'set_b = {" b "," d "};'? – user000001

+0

@ WernerVesterås Я знаю эту нить и волк-альфа, это не так хорошо, потому что мне нужно быть в сети. то же самое для char4j, также там диаграммы Венна выглядят ужасно ... мне нужно что-то вроде картинки. – reox

ответ

0

Я думаю, что эта программа делает преобразование вы хотите:

// The input 
    String[][] a = { 
     {"a", "b", "c", "d"}, 
     {"c", "d"}, 
     {"b", "c"} 
    }; 

    System.out.println("Input: "+ Arrays.deepToString(a)); 

    // Convert the input to a Set of Sets (so that we can hangle it more easily 
    Set<Set<String>> input = new HashSet<Set<String>>(); 
    for (String[] s : a) { 
     input.add(new HashSet<String>(Arrays.asList(s))); 
    } 

    // The map is used for counting how many times each element appears 
    Map<String, Integer> count = new HashMap<String, Integer>(); 
    for (Set<String> s : input) { 
     for (String i : s) { 
      if (!count.containsKey(i)) { 
       count.put(i, 1); 
      } else { 
       count.put(i, count.get(i) + 1); 
      } 
     } 
    } 

    //Create the output structure 
    Set<String> output[] = new HashSet[a.length + 1]; 
    for (int i = 1; i < output.length; i++) { 
     output[i] = new HashSet<String>(); 
    } 

    // Fill the output structure according the map 
    for (String key : count.keySet()) { 
     output[count.get(key)].add(key); 
    } 

    // And print the output 
    for (int i = output.length - 1; i > 0; i--) { 
     System.out.println("Set_" + i + " = " + Arrays.toString(output[i].toArray())); 
    } 

Выход:

Input: [[a, b, c, d], [c, d], [b, c]] 
Set_3 = [c] 
Set_2 = [d, b] 
Set_1 = [a] 
+0

, но графического представления нет. создание наборов очень просто, но как я могу генерировать диаграммы из этого? – reox

Смежные вопросы