我正在尝试建立一个程序的依赖方案作为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];
}
这导致
现在的问题是:
real
和func
之间的egdes重叠。如何将它们分开以便于识别。wrapper
到real
的边缘方向错误? 答案 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
添加到该节点属性
将所有内容放在一起的结果如下:
使用以下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
}