如何在DOT中将节点放在同一级别?

Tha*_*ess 34 dot graphviz

我想同时渲染多个树,并将所有根节点和所有叶节点放在同一级别上.

这是我正在尝试做的一个例子.根节点A和X在同一级别上,叶节点B,D和Z也是如此.

我想要的图表

我没有成功尝试将根放在一个等级中,然后留下另一个等级,如下所示:

digraph G { 
rankdir = TB;
subgraph {
A -> B
A -> C
C -> D
X -> Y
rank = same; A; X;
rank = same; B; D; Y;
} /* closing subgraph */
}
Run Code Online (Sandbox Code Playgroud)

并且在一切都处于相同等级的情况下得到了这个结果. 在此输入图像描述

关于我应该尝试什么的任何建议?我已经确定了根和叶子.

Sim*_*mon 55

rank = same; ...语句放在括号中,例如:

digraph G { 
  rankdir = TB;
  subgraph {
    A -> B
    A -> C
    C -> D
    X -> Y
    // note that rank is used in the subgraph
    {rank = same; A; X;}
    {rank = same; B; D; Y;}
  } /* closing subgraph */
}
Run Code Online (Sandbox Code Playgroud)

...给出了期望的结果:

在此输入图像描述

  • @WilliamJohnHolden:我同意你的观点,子图并不是真正必要的。在最初的问题中,它可能是整个图表的一部分,其余部分被省略以创建一个最小的示例。 (3认同)
  • 子图真的必要吗?我对这个结果感到满意:digraph {rankdir = LR; 1902387216 [label =“ h”]; 1902387216-> 1736863396 [label =“ child”]; 1736863396 [label =“ e”]; 1736863396-> 166482735 [label =“ peer”]; {rank =相同;1736863396;166482735;};166482735 [label =“ a”]; 166482735-> 915735320 [label =“ child”]; 915735320 [label =“ n”]; 915735320-> 1424861798 [label =“ child”]; 1424861798 [label =“ d”]; 1736863396-> 233979847 [label =“ child”]; 233979847 [label =“ r”]; } (2认同)

Bri*_*rns 7

这是一个受@William John Holden 评论启发的简单示例 -

graph {
  rankdir=LR;
  a -- b -- c;
  d -- e -- f;
  b -- d; {rank = same; b; d;};
}
Run Code Online (Sandbox Code Playgroud)

图形


Joh*_*and 7

理想的结构实际上是 rank max 和 rank min。不需要子图或任何其他恶作剧。GraphViz 对此有明确的设施。

对于复杂的图形,rank=same 通常会在图形的中间附近结束。如果您指的是顶部和底部,请说顶部和底部。

digraph G { 

  rankdir = TB;

  A -> B;
  A -> C -> D;
  X -> Y;

  { rank=min; A; X; }
  { rank=max; B; D; Y; }

}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明