【问题标题】:Graphviz Draw graph nodes using BFS orderGraphviz 使用 BFS 顺序绘制图节点
【发布时间】:2014-01-16 05:59:42
【问题描述】:

我有一个图形文件 (.dot),其节点具有 depth 和 size “属性”。我想使用 graphviz 绘制此图,将“深度”作为广度优先搜索的深度,将 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
}

【问题讨论】:

    标签: graph graphviz dot


    【解决方案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=same 子图中。}

    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。这假设您设置了根属性,并且考虑到明确的 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]
    }
    

    【讨论】:

    • 嗨,Emden,我已经编辑了我的问题,添加了一个小样本。你能指出我做错了什么吗?我正在使用 twopi 来生成输出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    • 2015-07-04
    • 2017-10-31
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多