如何控制graphviz中的节点位置(即避免边缘交叉)

我正在使用graphviz(点)来生成您可以在下面看到的graphics。 左下angular的节点(红色椭圆)会导致烦恼,因为其边缘会跨过相邻节点的几个边缘。 有没有办法限制节点放置到某个区域?

感谢您的想法

与其他边缘交叉的graphicshttp://i39.tinypic.com/e6od8z.png

我不知道有什么办法来控制个别节点的位置。 这并没有什么意义,因为为了做到这一点,您需要知道最终的图表是什么样的,但是手动放置一个节点会改变graphics的其余部分的渲染方式。

我通过更改.dot文件中定义节点的顺序,并在图层级调整nodesepranksep属性来解决此问题。 这是一个细化的过程 – 一次调整一些东西,直到看起来正确。

您也可以将graphics渲染为SVG ,然后将其导入到Visio(或其他编辑器)中,然后手动重新排列您不满意的节点。

您可以创build一个不可见的约束,使红色节点出现在所有其他节点的左侧。

 redNode -> leftmostNode [style=invis]; 

之前:

之前

后:

后

@Jannis,如果你仍然对这个问题有兴趣,实际上有一种方法可以控制单个节点的位置 – 你使用“pos”属性:

http://www.graphviz.org/doc/info/attrs.html#d:pos

作为一个例子,你可以写:

 n [pos="3,5!"]; 

这将迫使节点n精确地(3,5)

但是,这只适用于布局引擎“fdp”和“neato”。

我喜欢@smokris' [style=invis]诡计说服graphviz把东西放在你想要的地方,通过添加影响布局但不可见的边缘。


另一个技巧是constraint属性 ,它允许您添加可见但不影响布局的边。

如果添加一个新的边缘会弄乱graphics,请在该边缘上设置[constraint=false] :现在graphviz在放置节点时将忽略它。 🙂

如果为false ,则不用于sorting节点。 例如,在图中

 digraph G { a -> c; a -> b; b -> c [constraint=false]; } 

b -> c在等级分配期间不添加约束,所以唯一的约束是a在b和c之上,产生图: