dot中的子图集群排名

Chr*_*cke 12 dot graphviz

我正在尝试在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_aB1的反向边缘.它尝试将群集拉近尽可能靠近目标节点.要避免此边缘影响图形,请如图所示放松向上边缘上的约束,或者向前绘制边缘并使用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)

修正了布局

  • 这对我来说非常有效。关于自动化的评论:如果您的问题涉及结构(在我的例子中是控制流图),其中某些边可以被识别为“向后”(从循环出口到入口),然后自动用 `constraint = false` 标记这些边可以解决问题. 更一般地,可以根据图的 BFS 或 DFS 树(假设选定的根节点)计算后向边集。 (2认同)

小智 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)