我正在使用graphviz(点)来生成您可以在下面看到的图形。左下角的节点(红色椭圆)会导致烦恼,因为其边缘会跨越相邻节点的多个边缘。有没有办法限制节点放置到某个区域?如何控制graphviz中的节点位置(即避免边缘交叉)
感谢您的想法
graph with edge crossing several other edges http://i39.tinypic.com/e6od8z.png
我正在使用graphviz(点)来生成您可以在下面看到的图形。左下角的节点(红色椭圆)会导致烦恼,因为其边缘会跨越相邻节点的多个边缘。有没有办法限制节点放置到某个区域?如何控制graphviz中的节点位置(即避免边缘交叉)
感谢您的想法
graph with edge crossing several other edges http://i39.tinypic.com/e6od8z.png
我不知道,通过这些来控制单个节点的位置的任何手段。它没有任何意义,因为为了做到这一点,您需要知道最终图的样子,但手动放置一个节点会改变图的其余部分的渲染方式。
我通过更改在.dot
文件中定义我的节点的顺序,并在图层级调整nodesep
和ranksep
属性来解决此问题。这是一个细化的过程 - 每次调整一些东西,直到看起来正确。
您也可以将图形呈现为SVG
,然后将其导入到Visio(或其他编辑器)中,然后手动重新排列您不满意的节点。
@Jannis,如果你想继续在回答这个,有是实际控制单个节点放置的方式 - 使用“POS”属性:
http://www.graphviz.org/doc/info/attrs.html#d:pos
作为这样的一个例子,你可以写:
n [pos="3,5!"];
这将迫使节点n
是在精确(3,5)
。
但是,这只适用于布局引擎“fdp”和“neato”。
'pin'属性(!),是“fdp,neato only”(它不适用于点)。因此,除非你绕过点布局引擎,否则使用'pos'对于点来说没有意义。 – nobar 2011-03-03 20:24:17
@nobar:嗯,再次看着文档看起来你是对的 - 我的坏,对不起。 – 2011-03-05 16:24:48
我注意到了!也不适用于fdp,虽然它适用于neato。此外,应该管理“pos”属性中给定坐标的缩放的-s参数(默认值为72.0)似乎不起作用(导致段错误)。总之:将所有'pos'属性的数字除以72.0,并使用'neato'作品! – 2014-11-20 09:10:30
您可以创建一个不可见约束,以使红色节点出现在所有其他节点的左侧。
redNode -> leftmostNode [style=invis];
前:
后:
这解决了我的问题。我只是想让别的东西出现在另一边。谢谢。 – 2011-11-06 08:49:36
我喜欢@smokris' [style=invis]
伎俩说服graphviz的把你想要他们的东西,通过增加边这会影响布局但不可见。
另一个窍门是constraint
attribute,它可以让你添加的边缘这是可见的,但不会影响布局。
如果添加新边缘会使图形出现混乱,请在该边上设置[constraint=false]
:现在graphviz在放置节点时将忽略它。
如果是
false
,则不用边排序节点。例如,在 图表digraph G { a -> c; a -> b; b -> c [constraint=false]; }
边缘
b -> c
不秩分配期间添加约束,因此唯一的约束是一个 高于b和c,得到的图形:
我不认为Visio可以编辑一般的svg,但Inkscape可以。 – 2014-10-01 01:31:21
@GringoSuave:Inkscape确实可以,但如果移动节点,边缘不会跟随。这使得除了极少数节点之外的任何东西都不切实际。 – 2015-10-28 15:00:50
这是不正确的,不应该被接受的答案。以下答案分别是30和20票,每个答案都是很好的答案。 – 2017-04-14 01:18:36