ранжирование кластера подграфа в точке - PullRequest
12 голосов
/ 23 марта 2010

Я пытаюсь использовать graphviz на media wiki в качестве инструмента документации для программного обеспечения.

Во-первых, я задокументировал некоторые классовые отношения, которые работали хорошо. Все было расположено вертикально, как и ожидалось.

Но тогда некоторые из наших модулей - это 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>

image

Ответы [ 3 ]

12 голосов
/ 25 июля 2010

Макет является попыткой 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;
}

Corrected layout

5 голосов
/ 04 марта 2015

Мой опыт показывает, что 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;
}
0 голосов
/ 22 июля 2010

В результате будет получен график, который вы ищете:

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

Для этого создается подграф, который используется только в целях макета, чтобы обеспечить желаемый порядок сверху вниз.

...