如何控制graphviz中的节点位置(即避免边缘交叉)
我正在使用graphviz(点)来生成您可以在下面看到的graphics。 左下angular的节点(红色椭圆)会导致烦恼,因为其边缘会跨过相邻节点的几个边缘。 有没有办法限制节点放置到某个区域?
感谢您的想法
与其他边缘交叉的graphicshttp://i39.tinypic.com/e6od8z.png
我不知道有什么办法来控制个别节点的位置。 这并没有什么意义,因为为了做到这一点,您需要知道最终的图表是什么样的,但是手动放置一个节点会改变graphics的其余部分的渲染方式。
我通过更改.dot
文件中定义节点的顺序,并在图层级调整nodesep
和ranksep
属性来解决此问题。 这是一个细化的过程 – 一次调整一些东西,直到看起来正确。
您也可以将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之上,产生图: