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

时间:2014-09-08 22:50:17

标签: graphviz dot

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

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

Graph I want

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

digraph G { 
rankdir = TB;
subgraph {
A -> B
A -> C
C -> D
X -> Y
rank = same; A; X;
rank = same; B; D; Y;
} /* closing subgraph */
}

得到这个结果,一切都在同一级别。 enter image description here

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

3 个答案:

答案 0 :(得分:51)

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 */
}

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

enter image description here

答案 1 :(得分:4)

理想的结构实际上是等级最大和等级最小。不需要子图或其他任何恶作剧。 GraphViz为此具有明确的功能。

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

digraph G { 

  rankdir = TB;

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

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

}

enter image description here

答案 2 :(得分:3)

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

graph {
  rankdir=LR;
  a -- b -- c;
  d -- e -- f;
  b -- d; {rank = same; b; d;};
}

graph