10

我在这里有一个测试图,我想对其进行调整以使其看起来更好。

替代文字

这是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; 交换 6 和 1 相同)
  • 我希望 X1 与 10 处于相同的垂直位置,并且与 6 处于相同的水平位置。我该怎么做?
  • 我希望 8 和 X3 和 7 处于相同的垂直位置,还有 14 和 X4 和 3。我该怎么做?
  • ranksep=0.3;语句效果很好,除了 note8 -> 13 -> 14有更大的差距,就像X3 -> gap -> X4. 为什么它不遵守 rankep=0.3 规则,我该如何解决?
4

1 回答 1

17

以下是我能做的最好的:幻象节点和边缘帮助。但我似乎不能鼓励在横向(rankdir 的另一个方向)上进行特定的排序。

替代文字

 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;
    }

  }
于 2010-01-19T16:46:24.743 回答