我正在尝试在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>

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;
}

小智 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;
}