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

时间:2010-03-19 10:48:07

标签: graphviz edge-detection dot

我正在使用graphviz(点)生成您可以在下面看到的图表。左下角的节点(红色椭圆)因其边缘穿过相邻节点的几个边缘而引起烦恼。有没有办法将节点放置到某个区域?

graph with edge crossing several other edges

4 个答案:

答案 0 :(得分:46)

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

redNode -> leftmostNode [style=invis];

在:

before

后:

after

答案 1 :(得分:23)

@Jannis,如果你仍然对这个问题的答案感兴趣,那么 实际上是一种控制个别节点位置的方法 - 你使用“pos”属性:

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

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

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

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

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

答案 2 :(得分:12)

我喜欢@ smokris'通过添加影响布局但不可见的边缘,说服graphviz将内容放在您想要的位置的[style=invis]技巧。

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

如果添加新边缘会使图表混乱,请在该边缘设置[constraint=false]:现在,graphviz会在放置节点时忽略它。

  

如果false,则边缘不用于对节点进行排名。例如,在   图表

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

边缘b -> c在排名分配期间不添加约束,因此唯一的约束是a   在b和c之上,产生图表:

     

答案 3 :(得分:10)

我不知道有任何方法可以控制各个节点的位置。它没有多大意义,因为为了做到这一点,你需要知道最终图形的样子,然而手动放置一个节点会改变图形的其余部分的呈现方式。

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

您也可以将图表呈现为SVG,然后将其导入Visio(或其他编辑器)并手动重新排列您不满意的节点。