我正在尝试在media wiki上使用graphviz作为软件的文档工具.
首先,我记录了一些运作良好的阶级关系.一切都按预期垂直排列.
但是,然后,我们的一些模块是dll,我想分成一个盒子.当我将节点添加到集群时,它们已经过了边缘,但集群似乎有一个LR排名规则.或者被添加到群集中打破了节点的TB排名,因为群集现在出现在图表的一侧.
此图表示我正在尝试执行的操作:此时,cluster1和cluster2显示在cluster0的右侧.
我想/需要它们出现在下面.
<graphviz>
digraph d {
subgraph cluster0 {
A -> {B1 B2}
B2 -> {C1 C2 C3}
C1 -> D;
}
subgraph cluster1 {
C2 -> dll1_A;
dll1_A -> B1;
}
subgraph cluster2 {
C3 -> dll2_A;
}
dll1_A -> dll2_A;
}
</graphviz>
Run Code Online (Sandbox Code Playgroud)

Pek*_*kka 12
布局是Dot尝试最小化整体高度.
比所需布局更紧凑的一个原因是使用从dll1_a到B1的反向边缘.它尝试将群集拉近尽可能靠近目标节点.要避免此边缘影响图形,请如图所示放松向上边缘上的约束,或者向前绘制边缘并使用dir属性反转箭头.
这将有助于许多布局,但仅凭它不足以修复给定的示例.为了防止Dot维持紧凑的布局,它更喜欢你可以将minlen属性添加到应该保持(接近)垂直的边缘.这通常难以计算,但对于手动调整的布局是实用的.
digraph d {
subgraph cluster0 {
A -> {B1 B2}
B2 -> {C1 C2 C3}
C1 -> D;
}
subgraph cluster1 {
C2 -> dll1_A [minlen = 2];
dll1_A -> B1 [constraint = false];
/* B1 -> dll1_A [dir = back]; */
}
subgraph cluster2 {
C3 -> dll2_A;
}
dll1_A -> dll2_A;
}
Run Code Online (Sandbox Code Playgroud)

小智 5
我的经验表明,constraint=false通常会产生不必要的扭曲边缘。似乎可以weight=0提供更好的结果:
digraph d {
subgraph cluster0 {
A -> {B1 B2}
B2 -> {C1 C2 C3}
C1 -> D;
}
subgraph cluster1 {
C2 -> dll1_A [minlen = 2];
dll1_A -> B1 [weight = 0];
/* B1 -> dll1_A [dir = back]; */
}
subgraph cluster2 {
C3 -> dll2_A;
}
dll1_A -> dll2_A;
}
Run Code Online (Sandbox Code Playgroud)