2010-01-19 9 views
9

У меня здесь есть тестовый график, который я бы хотел настроить, чтобы он выглядел лучше.graphviz: мелкие хитрости, чтобы сделать график более приятным

alt text

Вот Graphviz (точка) источник, test6.dot:

digraph G { 
    ranksep=0.3; size="6.0,6.0"; 
    node [fontsize=11]; 

    subgraph clusterA { 
     X2 [shape=box]; 

     node [style=filled]; 
     1 -> 2 -> 3 -> X2 -> 5; 
     6; 
     7; 
     label = "A"; 
     color=blue 
    } 
    X1 [shape=box]; 
    subgraph clusterB { 
     node [style=filled]; 
     8; 
     9; 
     10 -> 11 -> 12; 
     12 -> 9; 
     12 -> 8 -> 13; 
     13 -> 14; 
     label = "B"; 
     color=blue 
    } 
    subgraph clusterC { 
     label = "C"; 
     { 
     node [style="invis"]; 
     gap; 
     } 
     node [shape=box]; 

     edge [style="invis"]; 
     X3 -> gap -> X4;   
    } 

    14 -> X4 -> 3; 
    6 -> X1 -> 10; 
    { edge [dir="both"]; 
     8 -> X3 -> 7; 
    } 

    9 -> X3 
    } 

Вопросы/изменения, которые я хотел бы сделать:

  • Я хочу, чтобы поток узлов 10 -> 11 -> 12 -> 8 -> 13 -> 14 к быть в вертикальной линии (свопинг 8 и 9 по горизонтали). Как я могу это сделать? (то же самое с 1 -> 2 -> 3 -> X2 -> 5; swap 6 и 1)
  • Я хочу, чтобы X1 находился в том же вертикальном положении, что и 10, и в том же горизонтальном положении, что и 6. Как я могу это сделать?
  • Я хочу, чтобы 8 и X3 и 7 находились в одном и том же вертикальном положении, также с 14 и X4 и 3. Как я могу это сделать?
  • Операция ranksep=0.3; прекрасно работает, за исключением того, что 8 -> 13 -> 14 имеет больший промежуток, равно как и X3 -> gap -> X4. Почему он не подчиняется правилу ranksep = 0.3 и как это исправить?

ответ

17

Ниже приведено самое лучшее, что я могу сделать: фантомные узлы и края помогают. Но я, похоже, не могу поощрять конкретный порядок в поперечном направлении (в другом направлении от рангарда).

alt text

digraph G { 
    ranksep=0.3; size="6.0,6.0"; 
    rankdir=TB; 

    node [fontsize=11]; 

    subgraph clusterA { 
     X2 [shape=box]; 
     label = "A"; 
     color=blue; 

     node [style=filled]; 
     /* force 1, 6, and 7 to be at the top together, 
      add enough phantoms to keep things in nice columns */ 
     { 
      node [style="invis", label=""]; 
      phantom3; 
      phantom4; 
      phantom5; 
      phantom6; 
     } 


      rank = same; 
      1 -> 2 -> 3 -> X2 -> 5;   

      edge [style="invis"]; 
      6 -> phantom3 -> phantom5; 
      7 -> phantom4 -> phantom6; 

    } 
    subgraph clusterB { 
     node [style=filled]; 
     label = "B"; 
     color=blue; 
     /* create an invisible phantom node 
      to take up space */ 
     { 
     node [style="invis",label=""]; 
     phantom1; 
     phantom1b; 
     } 

     { rank=same; 11; 
     phantom1; 
     } 

     10 -> 11 -> 12 -> 8 -> 13 -> 14; 
     12 -> 9; 
     phantom1 -> 9 -> phantom1b [style="invis"]; 

    } 


    /* force X1 to be at the same vertical pos as 10 
     (this yields a warning though) */ 
    { rank = same; 
     X1 [shape=box]; 
     10; 
    } 

    6 -> X1; 
    X1 -> 10 [weight=0.5]; 

    subgraph clusterC { 
     label = "C"; 

     phantom2 [style="invis", label=""]; 

     node [shape=box]; 

     edge [style="invis"]; 
     X3 -> phantom2 -> X4;   
    } 

    9 -> X3 [weight=0.5]; 

    { 
     edge [weight=20]; 
     14 -> X4 -> 3; 
     3 -> X4 -> 14 [style="invis"]; 
     /* add a reverse path so graphviz doesn't force 14 above X4 above 3 */ 
    } 
    { 
     edge [dir="both", weight=20]; 
     8 -> X3 -> 7; 
     7 -> X3 -> 8 [style="invis"]; 
     edge [style="invis"]; 
     X4 -> phantom6; 
     1 -> phantom2; 
     8 -> phantom2; 
    } 

    }