Graphviz:有向图中的平行边

时间:2013-10-21 10:33:11

标签: graphviz dot

我正在尝试建立一个程序的依赖方案作为dot中的有向图。因此我使用了以下代码:

digraph LINK { 
    rankdir=LR; 
    ranksep=0.65;
    nodesep=0.40;
    splines=false; 
    overlap=false;
    concentrate=false; 
    node[shape=box]; 
    subgraph clusterAPP {
            label="Application"; 
            style=dashed; 
            nodeA[label="d = func(...);"]; 

    }; 
    subgraph clusterFB{
            color=red;
            label="Wrapper"; 
            style=dashed; 
            rank=same; 
            wrapper[label="wrapper"]; 
            real[label="pointer to\nreal func"]; 
            wrapper -> real [constraint=false,label="dlopen\ndlsym"]; 
    }
    subgraph clusterBACKEND {
            label="Backend"
            style=dashed; 
            func[label="float func(...)"]; 
    };
    nodeA -> wrapper; 
    real -> func[weight=10];  
    func->real[color=blue]; 
}

这导致enter image description here

现在的问题是:

  • realfunc之间的egdes重叠。如何将它们分开以便于识别。
  • 为什么从wrapperreal的边缘方向错误?

1 个答案:

答案 0 :(得分:1)

您的第一个问题的答案已经在其他地方here on Stackoverflow给出了,原因是您可以使用ports postions或使用臭名昭着的marapet提到的技巧来添加在同一方向上的额外边缘,移除它的约束并反转边缘的方向并隐藏指向后方的边缘。

或者把它放在代码中:

real -> func [weight=10]                    // Remains unaltered  
real -> func [constraint=false, dir=back]   // Remove the constraint and reverse the edge
func -> real [style=invis]                  // Hide the edge pointing pack

至于为什么另一条边指向错误的方向,这与a bug in relation to constraint有关,应该在版本2.27中修复。您可能正在使用旧版本。 (我知道我是,因为很多* NIX包管理器默认仍然有2.26.X。)

要解决此问题,您需要手动将Graphviz更新为较新版本,或者(如果您已有更新版本或不想/不想更新)将dir=back添加到该节点属性

将所有内容放在一起的结果如下:

enter image description here

使用以下DOT代码:

digraph LINK { 
    rankdir=LR; 
    ranksep=0.65;
    nodesep=0.40;
    splines=false; 
    overlap=false;
    concentrate=false; 
    node[shape=box]; 
    subgraph clusterAPP {
            label="Application"; 
            style=dashed; 
            nodeA[label="d = func(...);"]; 

    }; 
    subgraph clusterFB{
            color=red;
            label="Wrapper"; 
            style=dashed; 
            rank=same; 
            wrapper[label="wrapper"]; 
            real[label="pointer to\nreal func"]; 
    }
    subgraph clusterBACKEND {
            label="Backend"
            style=dashed; 
            func[label="float func(...)"]; 
    };

    nodeA -> wrapper; 
    wrapper -> real [constraint=false, dir=back, label="dlopen\ndlsym"];  // Added reverse direction
    real -> func [weight=10]                    // Remains unaltered  
    real -> func [constraint=false, dir=back]   // Remove the constraint and reverse the edge
    func -> real [style=invis]                  // Hide the edge pointing pack

}