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

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,使其与DW在同一个水平线上?也就是说,让图表看起来像这样:

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的魔力。

1个回答

14

您可以使用一个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 output with invisible nodes


感谢您的及时和详细回复!我最初是通过使用不可见节点来实现它,但现在已经切换到第一种解决方案。感觉更加优雅,并且完美地工作。 - shadowmatter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接