4

我将以下输入提供给 Dot:

digraph G {
  subgraph cluster1 {
    fontsize = 20;
    label = "Group 1";
    A -> B -> C -> D;
    style = "dashed";
  }

  subgraph {
    O [shape=box];
  }

  subgraph cluster2 {
    fontsize = 20;
    label = "Group 2";
    Z -> Y -> X -> W [dir=back];
    style = "dashed";
  }

  D -> O [constraint=false];
  W -> O [constraint=false, dir=back];
}

它产生:

节点 O 与 A 和 Z 对齐的图片

如何对齐节点O以使其具有与D和相同的等级W?也就是说,一个看起来像这样的图表:

A   Z
|   |
B   Y
|   |
C   X
|   |
D-O-W

添加

 { rank=same; D; O; W; }

产生错误

Warning: D was already in a rankset, ignored in cluster G
Warning: W was already in a rankset, ignored in cluster G

我想我可以通过在 的子图中添加不可见的节点和边来破解它O,但我想知道我是否错过了一些 Dot 魔法。

4

1 回答 1

13

您可以使用一种方法与集群内的边缘一起rankdir=LR使用:constraint=false

digraph G {
  rankdir=LR;

  subgraph cluster1 {
    fontsize = 20;
    label = "Group 1";
    rank=same;
    A -> B -> C -> D [constraint=false];
    style = "dashed";
  }

  subgraph cluster2 {
    fontsize = 20;
    label = "Group 2";
    rank=same;
    Z -> Y -> X -> W [dir=back, constraint=false];
    style = "dashed";
  }

  O [shape=box];
  D -> O -> W;
}

这不是点魔法:-),但它实现了这一点:

带有rankdir LR的graphviz输出

使用隐形节点进行黑客攻击也可以:

digraph G {
  subgraph cluster1 {
    fontsize = 20;
    label = "Group 1";
    A -> B -> C -> D;
    style = "dashed";
  }

  subgraph {
    O1[style=invis];
    O2[style=invis];
    O3[style=invis];
    O [shape=box];

    O1 -> O2 -> O3 -> O [style=invis];
  }

  subgraph cluster2 {
    fontsize = 20;
    label = "Group 2";
    Z -> Y -> X -> W [dir=back];
    style = "dashed";
  }

  edge[constraint=false];
  D -> O -> W;
}

结果几乎相同:

带有不可见节点的graphviz输出

于 2013-05-18T21:36:03.570 回答