我正在使用 graphviz (dot) 来生成您可以在下面看到的图表。左下角的节点(红色椭圆)会引起烦恼,因为它的边缘穿过相邻节点的多个边缘。有没有办法将节点放置到某个区域?
5 回答
您可以创建一个不可见的约束,以使红色节点出现在所有其他节点的左侧。
redNode -> leftmostNode [style=invis];
前:
后:
我喜欢@smokris 的[style=invis]
技巧,它通过添加影响布局但不可见的边缘来说服 graphviz 把东西放在你想要的地方。
另一个技巧是constraint
属性,它允许您添加可见但不影响布局的边缘。
如果添加新边会弄乱您的图形,请[constraint=false]
在该边上设置:现在 graphviz 将在放置节点时忽略它。
如果
false
,则不使用边对节点进行排序。例如,在图中digraph G { a -> c; a -> b; b -> c [constraint=false]; }
边
b -> c
在等级分配期间不会添加约束,因此唯一的约束是 a 高于 b 和 c,从而产生图形:
@Jannis,如果您仍然对此问题的答案感兴趣,实际上有一种方法可以控制单个节点的放置 - 您使用“pos”属性:
http://www.graphviz.org/doc/info/attrs.html#d:pos
作为一个例子,你可以写:
n [pos="3,5!"];
这将迫使节点n
精确地位于(3,5)
。
但是,这只适用于布局引擎“fdp”和“neato”。
我不知道有什么方法可以控制单个节点的放置。这并没有真正的意义,因为为了做到这一点,您需要知道最终图形的外观,但是手动放置一个节点会改变图形其余部分的呈现方式。
我通过更改在文件中定义节点的顺序并在图形级别.dot
调整nodesep
和属性解决了这个问题。ranksep
这是一个细化的过程——一次调整一些东西,直到看起来正确。
您还可以将图形呈现为SVG
,然后将其导入 Visio(或其他编辑器)并手动重新排列您不满意的节点。
如果使用带有 -n2 参数的neato,则可以放置节点:
`dot -T ${format} -n2 -Goverlap-true -Gsplines=false -Kneato -o ${ output } ${ input }`
例如
dot -T png -n2 -Goverlap-true -Gsplines=false -Kneato -o monkey.png monkey.dot
neato 期望从左下角开始的所有内容都以点(1/72 英寸)为单位。
以下点文件按指定放置所有内容,但有点烦恼的是位置始终是对象的中心
digraph G {
overlap=true
bgcolor="transparent"
node [
shape=box
width=1.2
height=1.2
fillcolor="#e9e9e9"
fontcolor="#333333"
fontsize=18
style="filled"
color="#aaaaaa"
];
edge [
penwidth=2
fontsize=18
margin=0.01
labelfloat=true
fontcolor="#333333"
color="#bbbbbb"
];
d [pos="864,2016!" ] [label="D" ] [width=16 height=16]
subgraph x {
node [color="#886600" fillcolor="#dd9944"]
A [pos="1440,1440!" ]
c [pos="864,2016!" ] [label="C" ]
A -> c
monkey [pos="1008,1872!" ] [label="HI MONKEY" ]
A -> c [label="THIS WAY" ] [ pos="s,1440,1483 e,907,2016 1440,1488 1440,1856 1280,2016 912,2016" ][ lp="1360, 1936 " ]
}
F [pos="576,1440!" ]
up_left [pos="72,2808!"][label="" height=1 width=1 penwidth=0 color="red"] down_right [pos="2808,72!"] [label="" height=1 width=1 fillcolor="red" penwidth=0 color="red"]
}