我正在尝试绘制 GraphViz 图表(使用 version 2.38.0 (20140413.2041)),但在让它按照我想要的方式布局时遇到了很多麻烦。我已经尝试了隐藏边、约束操作、子图(集群和非集群)等的许多不同组合,但似乎没有任何效果是我想要的。
这是我当前的代码:
digraph G {
subgraph clustera {
style=invis;rank=same
A->B->C
}
subgraph clusterb {
style=invis;rank=same;rankdir=LR
D->E [constraint=false]
}
subgraph clusterc {
style=invis;rank=same
F->G [constraint=false]
}
C -> D
D -> F [constraint=false]
E -> C
F -> A [constraint=false]
F -> C [constraint=false]
F -> E [constraint=false]
}
Run Code Online (Sandbox Code Playgroud)
这是它的渲染方式dot -Tpng:

(所有F边都关闭了“约束”,因为几乎任何其他东西都会严重扭曲图表。)
我想要的是:
F之上的节点GF并且G或多或少在图表上垂直居中F并G在右侧A通过EAE或多或少地通过他们现在的安排F到A、C、 和E以及从D到 的边或多或少遵循直线(即不围绕/组F的右侧布线)FGA和上方C的中心,但这不太重要DE(我非常不希望的一件事是 forF出现在上面A,就好像它是图表的根一样。)
这是我正在寻找的近似值,在 yEd 中手工列出:

这在 GraphViz 中可行吗?
(我应该指出,我非常愿意使用其他 GraphViz 工具之一,只是这是dot我唯一熟悉的工具。)
这是我的方法,没有subgraphs和weigths,只有groups 垂直对齐节点,constraint=false并dir=back保留布局扭曲。
digraph G {
// nodes without a group
D;
E;
// group left side
node[group=left];
A -> B -> C -> D;
C -> E [dir=back];
D -> E [constraint=false];
// group right side
node[group=right];
F -> G;
// inter group edges
F -> C;
edge [constraint=false];
D -> F;
F -> A;
F -> E;
}
Run Code Online (Sandbox Code Playgroud)
结果可以在此处看到,并且与您的近似值相对应。
只需要一个簇即可保持 ABCDE 组对齐。向后的方向箭头和权重很有帮助。
digraph g
{
subgraph cluster_subCDE {
color=invis;
A; B; C; D; E;
}
A->B [weight=10];
A->F [dir=back];
B->C [weight=10];
F->C;
C->E [color=invis];
C->D;
D->E [constraint=false];
E->C;
F->G [weight=10];
F->D [dir=back];
F->E;
}
Run Code Online (Sandbox Code Playgroud)
