【问题标题】:Why does a top to bottom graphviz dot graph get layed out counter clockwise?为什么从上到下的graphviz点图逆时针排列?
【发布时间】:2011-02-04 17:37:28
【问题描述】:

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

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

digraph {
 rankdir = TB;
 1 -> 2 -> 3 -> 1;
}

如何让 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}
}

产生这个结果

虽然我想要这个

谢谢

【问题讨论】:

  • 1 -> 2 -> 3 -> 4 -> 1; {rank = same; 2; 4} 也会产生一个逆时针图,虽然它很可能是顺时针的
  • 您是否正在寻找有关如何以“正确”方式执行此操作的答案?我 99% 确定没有“魔法”指令会自动产生此输出,并且任何其他可能实现所需输出(不可见节点等)的方法都将比反转边缘方向更“hackier”。 Graphviz 的强项是自动布局图,从左到右布置节点对我来说似乎是正确的。如果您需要手动对其进行微调,其他工具可能会更有用且更快地实现结果。
  • 那么我不会再寻找“正确”的方式了 :) 我只是想,因为一切都是逆时针排列的(afaik),所以必须有一个设置来扭转它。但是如果没有,我可以恢复边缘方向。
  • 另一个相关的 SO 问题stackoverflow.com/questions/1510784/…

标签: graphviz dot


【解决方案1】:

为什么这段代码会生成这张图?

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

2 -> 3 -> 1 -> 2;

节点 2 会在上面,并且在使用时

3 -> 1 -> 2 -> 3;

节点 3 将是顶部节点。

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

如果你绝对必须使用点布局引擎,下面的点代码

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,图表就会一团糟。
  • 但是你最后提到的 hack 对我有用。虽然我知道这可能不是“正确”的答案,但这就是我现在所需要的。谢谢
  • 感谢 [dir=back] 的技巧,它帮助我在 Sphinx 中创建了我想要的图形布局(默认使用点布局引擎)。
  • [dir=back] 可让您制作控制系统图,其中反馈路径通常位于底部且方向相反。请参阅:tikz/latex example
猜你喜欢
  • 1970-01-01
  • 2012-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
  • 2012-08-09
  • 2016-02-06
相关资源
最近更新 更多