我正在尝试使用graphviz可视化树结构,问题是随着图形变大,graphviz开始重新排列节点的顺序。说我有以下内容,
A
/ | \
B C D
它变成了,
A
/ | \
B D C
它可能是为了节省空间,但在我的上下文节点中,我尝试添加的顺序很重要,
graph [ordering="out"];
但它没有改变输出。
编辑:
digraph bt {
graph [ordering="out"];
node [style="rounded", shape=box]
N_2386 -> N_2387
N_2387 -> N_2388
N_2388 -> N_2389
N_2388 -> N_2390
N_2387 -> N_2391
N_2386 -> N_2392
subgraph cluster_2393 {
labeljust = "l";
style=dashed;color="#B0B0B0"
N_2392 -> N_2394
N_2394 -> N_2395
N_2395 -> N_2396
N_2396 -> N_2397
N_2397 -> N_2398
N_2397 -> N_2399
N_2396 -> N_2400
N_2400 -> N_2401
N_2400 -> N_2402
N_2395 -> N_2403
N_2403 -> N_2404
N_2404 -> N_2405
N_2405 -> N_2406
N_2403 -> N_2407
N_2407 -> N_2408
N_2408 -> N_2409
N_2409 -> N_2410
N_2410 -> N_2411
N_2411 -> N_2412
N_2412 -> N_2413
N_2412 -> N_2414
N_2412 -> N_2415
N_2411 -> N_2416
N_2416 -> N_2417
N_2416 -> N_2418
N_2416 -> N_2419
N_2408 -> N_2420
N_2408 -> N_2421
N_2403 -> N_2422
N_2395 -> N_2423
N_2392 -> N_2424
}
}
有问题的图表我需要的是,N_2387应该在右边N_2392应该在左边。这是我插入它们的顺序。
答案 0 :(得分:8)
我尝试了以下
digraph g {
ordering=out ;
node [shape=box] ;
a -> b ; a -> c ; a -> d ; a -> e ; a -> f ;
a -> g ; a -> h ; a -> i ; a -> j ; a -> k ;
a -> l ; a -> m ; a -> n ; a -> o ; a -> p ;
a -> q ; a -> r ; a -> s ; a -> t ; a -> u ;
a -> v ; a -> w ; a -> x ; a -> y ; a -> z ;
}
并且所有节点b
- z
按正确顺序位于同一级别。
你用的是哪个版本?
答案 1 :(得分:3)
如果要控制特定项目的排序,请在它们之间使用不可见的边缘。将其与 rank 指令相结合可以为您提供很多控制。
例如:这是Graphviz的示例 tagcloud 布局:
/*
Using a graph and relationships just to push things onto different lines.
Two layout rules:
1) all items on a given line go into a "rank=same" phrase
2) a relationship is needed between the first word on each line and the next line down to
force the vertical alignment.
*/
digraph {
edge[style=invisible]
node[shape=none]
fred [fontsize=18]
harry [fontsize=8]
jack [fontsize=12]
sally [fontsize=12]
mika
amy
jan
jack -> fred
fred -> mika
{rank=same;fred;harry}
{rank=same;mika amy; jan}
}
答案 2 :(得分:1)
如果将第一个分支更改为子图,则两个子图将按文件中的顺序排序。
似乎子图作为普通节点具有更高的优先级,因此ordering=out
似乎没有被尊重。
这有效:
digraph bt {
graph [ordering="out"];
node [style="rounded", shape=box]
N_2386 -> N_2387
subgraph cluster_first {
N_2387 -> N_2388
N_2388 -> N_2389
N_2388 -> N_2390
N_2387 -> N_2391
}
N_2386 -> N_2392
subgraph cluster_2393 {
labeljust = "l";
style=dashed;color="#B0B0B0"
N_2392 -> N_2394
N_2394 -> N_2395
N_2395 -> N_2396
N_2396 -> N_2397
N_2397 -> N_2398
N_2397 -> N_2399
N_2396 -> N_2400
N_2400 -> N_2401
N_2400 -> N_2402
N_2395 -> N_2403
N_2403 -> N_2404
N_2404 -> N_2405
N_2405 -> N_2406
N_2403 -> N_2407
N_2407 -> N_2408
N_2408 -> N_2409
N_2409 -> N_2410
N_2410 -> N_2411
N_2411 -> N_2412
N_2412 -> N_2413
N_2412 -> N_2414
N_2412 -> N_2415
N_2411 -> N_2416
N_2416 -> N_2417
N_2416 -> N_2418
N_2416 -> N_2419
N_2408 -> N_2420
N_2408 -> N_2421
N_2403 -> N_2422
N_2395 -> N_2423
N_2392 -> N_2424
}
}
答案 3 :(得分:0)
Graphviz旨在生成具有令人愉悦的外观的图形。试图强制布局会失去工具的大部分价值。
如上所述,隐形边可用于强制执行某些布局,而词典排序(较早的节点往往更多地放置)也可以表示偏好。
通常,为布局添加更多约束会产生难以排除故障的不正确布局。
与预期布局的某些偏差不应自动导致尝试强制结果。较少的约束使得生成的图形随着时间的推移而保持良好的外观,即使它们的外观可以从根本上改变。