我有一个简单的graphviz图,如下图所示:
digraph G {
"Model" -> "Task";
"Task" -> "Worker 1" -> "Sink";
"Task" -> "Worker 2" -> "Sink";
"Task" -> "Worker 3" -> "Sink";
}
在接收器和任务节点之间添加和边缘,图形输出如下图所示:
"Sink" -> "Model";
如何添加此边缘并保持第一张图像中显示的原始对称节点布局?
答案 0 :(得分:1)
(编辑改进我的原始答案)
根据How to control subgraphs' layout in dot?的答案,如果我们首先使用dot
布置核心有向图,我们就可以使用neato
添加额外的边缘。 neato
允许使用-n
参数固定已定义位置的节点,因此可以执行以下操作(其中symmetric.dot
包含原始GraphViz有向图,并添加{{1} }):
graph [splines = true]
这个脚本:
#!/bin/bash
dot -Tdot symmetric.dot >symmetric1.dot
neato -n2 -Tpng symmetric1.dot -osymmetric1.png
sed 's/^}/"Sink" -> "Model";}/' <symmetric1.dot >symmetric2.dot
neato -n2 -Tdot symmetric2.dot >symmetric3.dot
neato -n2 -Tpng symmetric3.dot -osymmetric3.png
将原始有向图布局为新的dot
文件。.dot
绘制原始有向图。 neato -n2
选项阻止-n2
移动已有位置的节点。 neato
插入sed
边缘。"Sink" -> "Model"
布置新边(这是唯一没有定义neato -n2
的边缘,因此唯一没有固定的边缘)并将其绘制为pos
文件。< / LI>
醇>
.png
看起来像这样:
... symmetric1.png
附加边缘如下所示: