Выравнивание нескольких коротких узлов параллельно с одним высоким узлом в GraphViz - PullRequest
3 голосов
/ 14 ноября 2010

Я хочу создать что-то вроде этого - важно выравнивание узлов, а не угол ребер:

+--------------+
|              |
+--------------+
   |        |
   V        V
+-----+  +-----+  <--- alignment at top
|     |  |     |
|     |->|     |
|     |  |     |
+-----+  |     |
   |     |     |
   V     |     |
+-----+  |     |
|     |  |     |
|     |->|     |
|     |  |     |
+-----+  +-----+  <--- alignment at bottom
   |        |
   V        V
+--------------+
|              |
+--------------+

Лучшее, что я смог придумать, - это вставить два левых узла в подграф кластера с белой (=> невидимой) границей и установить вес одного из ребер равным 0. Но это все равно не совсем верно:

digraph G {

    // scale things down for example
    size="5,5" 
    rankdir=TD
    ranksep=1
    nodesep=1

    node [shape=box]

    node [width=5 height=2]
    top

    subgraph cluster_left
    {
        color=white
        node [width=2 height=2]
        left1
        left2
    }

    node [width=2 height=5]
    right

    node [width=5 height=2]
    bottom

    top->left1
    top->right

    left1->left2
    left1->right
    left2->right [weight=0]

    left2->bottom
    right->bottom
}

Это выглядит так - плохо выровнено:

image

Есть идеи, как получить то, что я хочу?

1 Ответ

3 голосов
/ 14 ноября 2010

Я сделал это с Neato и этот скрипт:

digraph G {
  layout="neato"
  // scale things down for example
  size="5,5" 
  rankdir=TD
  ranksep=1
  nodesep=1

  node [shape=box]

  top[pos="5,10!", width=5, height=2]

  left1[pos="3.5,7!", width=2, height=2]
  left2[pos="3.5,4!", width=2, height=2]

  right[pos="6.5,5.5!", width=2, height=5]

  bottom[pos="5,1!", width=5, height=2]

  top->left1
  top->right

  left1->left2
  left1->right
  left2->right

  left2->bottom
  right->bottom
}

Вот результат:

alt text

...