为什么从上到下的Graphviz点图会逆时针布局?

3
为什么这段代码会生成这个图形?
digraph {
 rankdir = TB;
 1 -> 2 -> 3 -> 1;
}

1

我该如何让graphviz/dot生成像这样顺时针方向的图形?

2

更新

这是我想要生成的最终图表(据我所知,逻辑上是正确的)

digraph {
  rankdir = TB
  start -> 1
  1 -> 2 -> 3 -> 1
  3 -> end
  3 -> increment
  end -> product
  {rank = same; 2; 3; increment}
  {rank = same; end; product}
}

这将产生以下结果

3

虽然我想要这个

4


1 -> 2 -> 3 -> 4 -> 1; {rank = same; 2; 4} 这段代码产生的图形可能是逆时针的,而不是顺时针的。 - Alex Lawrence
1
你是否在寻找如何以“正确”的方式完成这个任务的答案?我99%确定没有“神奇”的指令可以自动产生这种输出,而任何其他可能实现所需输出(如不可见节点等)的方法都比反转边方向更加“hackier”。Graphviz的优势在于自动布局图形,并且从左到右布置节点对我来说似乎是正确的。如果您需要手动微调它们,则其他工具可能更有用且更快地实现结果。 - marapet
那我就不再寻找“正确”的方法了 :) 我只是想,既然一切都是逆时针排列的(据我所知),肯定有一个设置可以反转它。但如果没有的话,我也很满意恢复边缘方向。 - Alex Lawrence
另一个相关的SO问题https://dev59.com/MnI_5IYBdhLWcg3wJPdu - marapet
1个回答

10
为什么这段代码会生成这张图表?
有向图根据节点之间的关系将其放置在不同的等级上。由于1指向2,因此它必须在2上方,并且由于2指向3,它可以处于3的上方。 但是由于3也指向1,圆圈被完成,任何3个节点中的一个都可能位于顶部。Graphviz简单地将最先提到的节点放在顶部。因此,如果您编写以下代码:
2 -> 3 -> 1 -> 2;

节点2将在顶部,当使用时

3 -> 1 -> 2 -> 3;

节点3将成为顶级节点。

可能布局引擎neato更适合这个图形,它会生成一个顺时针方向的图形:

neato layout

如果您非常需要使用点布局引擎,则可以使用以下dot代码:

digraph {
  rankdir = TB;
  1 -> 2;
  3 -> 2 [dir=back];
  3 -> 1;
  {rank=same; 2; 3;}
}
通过将边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;}

这个技巧产生了以下结果:

hack


感谢解释。我在LaTeX中使用dottex。老实说,我几乎没有graphviz/dot/neato或其他所需工具的经验。如果我写上layout=neato,图形就会变得一团糟。 - Alex Lawrence
但是你上次提到的那个hack对我很有效。虽然我知道这可能不是“正确”的答案,但现在这就是我需要的。谢谢。 - Alex Lawrence
1
感谢 [dir=back] 技巧,它帮助我在Sphinx中创建了我想要的图形布局(默认使用dot布局引擎)。 - vdboor
[dir=back] 允许您创建控制系统图,其中反馈路径通常位于底部并具有相反的方向。请参见:tikz/latex example - artless noise

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