2010-03-19 88 views

回答

9

我不知道,通过这些来控制单个节点的位置的任何手段。它没有任何意义,因为为了做到这一点,您需要知道最终图的样子,但手动放置一个节点会改变图的其余部分的渲染方式。

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

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

+1

我不认为Visio可以编辑一般的svg,但Inkscape可以。 – 2014-10-01 01:31:21

+0

@GringoSuave:Inkscape确实可以,但如果移动节点,边缘不会跟随。这使得除了极少数节点之外的任何东西都不切实际。 – 2015-10-28 15:00:50

+2

这是不正确的,不应该被接受的答案。以下答案分别是30和20票,每个答案都是很好的答案。 – 2017-04-14 01:18:36

22

@Jannis,如果你想继续在回答这个,有实际控制单个节点放置的方式 - 使用“POS”属性:

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

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

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

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

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

+18

'pin'属性(!),是“fdp,neato only”(它不适用于点)。因此,除非你绕过点布局引擎,否则使用'pos'对于点来说没有意义。 – nobar 2011-03-03 20:24:17

+1

@nobar:嗯,再次看着文档看起来你是对的 - 我的坏,对不起。 – 2011-03-05 16:24:48

+0

我注意到了!也不适用于fdp,虽然它适用于neato。此外,应该管理“pos”属性中给定坐标的缩放的-s参数(默认值为72.0)似乎不起作用(导致段错误)。总之:将所有'pos'属性的数字除以72.0,并使用'neato'作品! – 2014-11-20 09:10:30

35

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

redNode -> leftmostNode [style=invis]; 

前:

before

后:

after

+1

这解决了我的问题。我只是想让别的东西出现在另一边。谢谢。 – 2011-11-06 08:49:36

5

我喜欢@smokris' [style=invis]伎俩说服graphviz的把你想要他们的东西,通过增加边这会影响布局但不可见。


另一个窍门是constraint attribute,它可以让你添加的边缘这是可见的,但不会影响布局。

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

如果是false,则不用边排序节点。例如,在 图表

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

边缘b -> c不秩分配期间添加约束,因此唯一的约束是一个 高于b和c,得到的图形: