为什么从上到下的graphviz点图形逆时针摆放?

Ale*_*nce 3 dot graphviz

我用图形和更多细节更新了问题.感谢marapet,没有黑客,我无法生成所需的图像结果.

为什么这段代码产生了这个图?

digraph {
 rankdir = TB;
 1 -> 2 -> 3 -> 1;
}
Run Code Online (Sandbox Code Playgroud)

如何让graphviz/dot产生这样的顺时针方向?

更新

这是我想要生成的最终图表(afaik逻辑上正确的这种方式)

digraph {
  rankdir = TB
  start -> 1
  1 -> 2 -> 3 -> 1
  3 -> end
  3 -> increment
  end -> product
  {rank = same; 2; 3; increment}
  {rank = same; end; product}
}
Run Code Online (Sandbox Code Playgroud)

这产生了这个结果

虽然我想要这个

谢谢

mar*_*pet 9

为什么此代码会生成此图表?

有向图根据它们的关系将其节点放在不同的等级上.从1点到2点,它必须高于2,并且由于2点到3点,它必须高于3.但由于3也指向1,所以圆圈完成 - 3个节点中的任何一个都可以在顶部.Graphviz只是将第一个提到的节点放在首位.因此,如果你改写:

2 -> 3 -> 1 -> 2;
Run Code Online (Sandbox Code Playgroud)

节点2将位于顶部,并在使用时

3 -> 1 -> 2 -> 3;
Run Code Online (Sandbox Code Playgroud)

节点3将是顶级节点.

可能布局引擎neato更适合此图形,生成顺时针方向的图形:

neato布局

如果绝对必须使用点布局引擎,请使用以下点代码

digraph {
  rankdir = TB;
  1 -> 2;
  3 -> 2 [dir=back];
  3 -> 1;
  {rank=same; 2; 3;}
}
Run Code Online (Sandbox Code Playgroud)

通过将边缘2-> 3更改为3-> 2并同时反转箭头方向来产生所需的输出.

或者,相同技术的另一个变体,更容易解释:我们颠倒所有箭头的顺序(1-> 3-> 2-> 1),但向后显示它们(dir = back),并强制节点2和3处于同一级别:

rankdir = TB;
edge[dir=back];
1 -> 3 -> 2 -> 1;
{rank=same; 2;3;}
Run Code Online (Sandbox Code Playgroud)

这个hack会产生以下结果:

劈