Graphviz使用BFS顺序绘制图形节点

时间:2013-12-29 01:04:40

标签: graph graphviz dot

我有一个图形文件(.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
}

1 个答案:

答案 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]
}