垂直对齐Graphviz中连接子图的节点

sha*_*ter 4 dot alignment graphviz

我给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];
}
Run Code Online (Sandbox Code Playgroud)

它产生:

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

如何对齐节点O以使其具有DW?相同的等级?也就是说,图表看起来像:

A   Z
|   |
B   Y
|   |
C   X
|   |
D-O-W
Run Code Online (Sandbox Code Playgroud)

添加

 { rank=same; D; O; W; }
Run Code Online (Sandbox Code Playgroud)

产生错误

Warning: D was already in a rankset, ignored in cluster G
Warning: W was already in a rankset, ignored in cluster G
Run Code Online (Sandbox Code Playgroud)

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

mar*_*pet 13

您可以使用方法rankdir=LRconstraint=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;
}
Run Code Online (Sandbox Code Playgroud)

这不是点魔术:-),但它达到了这个目的:

具有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;
}
Run Code Online (Sandbox Code Playgroud)

结果几乎相同:

具有不可见节点的graphviz输出