我有一个图形文件(.dot),其节点具有深度和 size “属性”。我想使用graphviz绘制此图,将“depth”视为广度优先搜索的深度,将size属性视为节点的相对大小。
我尝试过使用twopi并在同一级别上设置所有具有相同深度的节点,但没有成功。关于如何实现这一目标的任何建议?
示例图:
strict digraph {
root = 0;
ranksep = 5;
{rank=same;
0
14754221888142813049
}
{rank=same;
17110173155996056797
8860119836345733269
12488214955576990298
5164430016200693425
6534280015544966791
16035081712171710670
7728255721346380016
3065692608114503807
15537038826989012875
15464545769657918305
7964210557574239786
17237485240931079100
9667703542183627069
9063621412962345275
4956992700610885217
703599774521196210
}
0 [label="A"];
14754221888142813049 [label="B"];
17110173155996056797 [label="C"];
8860119836345733269 [label="D"];
12488214955576990298 [label="E"];
5164430016200693425 [label="F"];
6534280015544966791 [label="G"];
16035081712171710670 [label="H"];
7728255721346380016 [label="I"];
3065692608114503807 [label="J"];
15537038826989012875 [label="K"];
15464545769657918305 [label="L"];
7964210557574239786 [label="M"];
17237485240931079100 [label="N"];
9667703542183627069 [label="O"];
9063621412962345275 [label="P"];
4956992700610885217 [label="Q"];
703599774521196210 [label="R"];
0 -> 14754221888142813049
0 -> 12488214955576990298
0 -> 5164430016200693425 [weight=0, constraint=false];
0 -> 15537038826989012875
0 -> 7964210557574239786
0 -> 9667703542183627069
0 -> 17237485240931079100
5164430016200693425 -> 8860119836345733269 [weight=0, constraint=false];
8860119836345733269 -> 4956992700610885217
8860119836345733269 -> 9063621412962345275
8860119836345733269 -> 703599774521196210
8860119836345733269 -> 17110173155996056797
8860119836345733269 -> 6534280015544966791
8860119836345733269 -> 16035081712171710670
8860119836345733269 -> 7728255721346380016
8860119836345733269 -> 3065692608114503807
8860119836345733269 -> 15464545769657918305
}
答案 0 :(得分:1)
您正在尝试捕获层次结构,因此您想要使用点布局。默认情况下,如果边缘为a-> b,则节点b将比节点a低1级。如果您有一棵树,并确保首先显示深度为0的节点,则默认情况下您将获得所需的布局。如果您的图表更复杂,提到的边缘标准或循环中断可能会干扰您的需求。在这种情况下,您需要使深度约束更明确,并关闭其他边缘约束。有几种方法可以做到这一点。
假设您有以下图表,其中节点名称中的数字表示深度。
digraph {
0 -> a1
0 -> b1
a1 -> a2
a1 -> b2
b1 -> c2
b1 -> d2
a2 -> d2
a2 -> b1
}
获得所需内容的一种简单方法是执行BFS,并将任何不属于BFS树的边设置为约束= false。
digraph {
0 -> a1
0 -> b1
a1 -> a2
a1 -> b2
b1 -> c2
b1 -> d2
a2 -> d2 [constraint=false]
a2 -> b1 [constraint=false]
}
或者你可以使用rank = same来确保节点被放置在与其深度相对应的等级上,再次关闭冲突的边缘。 (这假设您至少有一条边从深度0到底部。如果没有,您可以引入一个不可见的虚拟节点链和满足此要求的边,并将每个虚节点添加到其rank =相同的子图。} < / p>
digraph {
0 -> a1
0 -> b1
a1 -> a2
a1 -> b2
b1 -> c2
b1 -> d2
a2 -> d2 [constraint=false]
a2 -> b1 [constraint=false]
{rank=same a1 b1}
{rank=same a2 b2 c2 d2}
}
这允许深度函数实际上不与BFS树相关联。
顺便说一句,twopi应该有效,但布局中心不是自上而下,因为它的级别基于来自根节点的BFS。这假设你设置了root属性,并且因为你有一个明确的BFS,通过设置weight = 0来关闭非树边缘。
digraph {
root=0
0 -> a1
0 -> b1
a1 -> a2
a1 -> b2
b1 -> c2
b1 -> d2
a2 -> d2 [weight=0]
a2 -> b1 [weight=0]
}