代码之家  ›  专栏  ›  技术社区  ›  Chris Becke

子图簇按点排序

  •  11
  • Chris Becke  · 技术社区  · 15 年前

    我正在尝试使用媒体wiki上的graphviz作为软件的文档工具。

    首先,我记录了一些有效的类关系。一切都按预期进行了垂直排列。

    但是,然后,我们的一些模块是DLL,我想把它分成一个盒子。当我将节点添加到集群中时,它们被边缘化了,但是集群似乎有一个LR排名规则。或者添加到集群中会破坏节点的TB排名,因为集群现在出现在图的一侧。

    此图表示我正在尝试执行的操作:此时,cluster1和cluster2出现在 正确的 群集0的。

    我希望/需要它们出现在下面。

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

    3 回复  |  直到 10 年前
        1
  •  11
  •   Pekka    13 年前

    该布局是一个尝试点,以尽量减少整体高度。

    比所需布局更紧凑的一个原因是使用了从 DLL1Ia 地下一层 . 它试图尽可能地将集群拉回到目标节点。要避免此边影响图形,请放宽 约束 在如图所示的向上边缘,或沿向前方向绘制边缘并使用 迪尔 属性来反转箭头。

    这将有助于许多布局,但单靠它还不足以修复给出的示例。为了防止点保持其首选的紧凑布局,可以添加 小精灵 属性设置为应保持(接近)垂直的边。一般来说,这可能很难计算,但对于手动调整的布局来说是可行的。

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

    Corrected layout

        2
  •  3
  •   Hartmut Schäfer    10 年前

    我的经验表明 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;
    }
    
        3
  •  0
  •   diverscuba23    15 年前

    这将生成您要查找的图形:

    digraph d {
      subgraph cluster0 {
        A -> {B1 B2}
        B2 -> {C1 C2 C3}
        C1 -> D;
      }
    
      subgraph {
        rankdir="TB"
        subgraph cluster1 {
          C2 -> dll1_A;
          dll1_A -> B1;
        }
    
        subgraph cluster2 {
          C3 -> dll2_A;
        }
      }
      dll1_A -> dll2_A;
    }
    

    它所做的是创建一个子图,该子图仅用于布局目的,以提供所需的从上到下的顺序。

    推荐文章