Графвиз: древовидная структура - PullRequest
0 голосов
/ 14 декабря 2018

Я хочу использовать graphviz для генерации дерева структур, типа слева направо (пожалуйста, игнорируйте цвета):

Desired outcome

Я пришелк выводу, что мне нужно использовать невидимые узлы, чтобы добиться этого, мой текущий код выглядит так:

digraph G { 
  node [ shape="box", width = 2, height = 1, fixedsize=true];
  edge [arrowhead=none];
  nodesep = 1;
  ranksep=0.05;
  splines = ortho;
  rankdir = LR;

  A1 [ shape="box", width = 2, height = 1, fixedsize=true];
  B1 [ shape="box", width = 2, height = 1, fixedsize=true];
  B2 [ shape="box", width = 2, height = 1, fixedsize=true];
  B3 [ shape="box", width = 2, height = 1, fixedsize=true];
  B4 [ shape="box", width = 2, height = 1, fixedsize=true];
  B5 [ shape="box", width = 2, height = 1, fixedsize=true];
  B6 [ shape="box", width = 2, height = 1, fixedsize=true];

  W0 [ shape="circle", width = 0, height = 0, fixedsize=true, label=""];
  W1 [ shape="circle", width = 0, height = 0, fixedsize=true, label=""];
  W2 [ shape="circle", width = 0, height = 0, fixedsize=true, label=""];
  W3 [ shape="circle", width = 0, height = 0, fixedsize=true, label=""];
  W4 [ shape="circle", width = 0, height = 0, fixedsize=true, label=""];
  W5 [ shape="circle", width = 0, height = 0, fixedsize=true, label=""];
  W6 [ shape="circle", width = 0, height = 0, fixedsize=true, label=""];

  subgraph {
    A1 -> W0
    W0 -> W3
    W3 -> W2
    W2 -> W1
    W0 -> W4
    W4 -> W5
    W5 -> W6

    W1 -> B1
    W2 -> B2
    W3 -> B3
    W4 -> B4
    W5 -> B5
    W6 -> B6

    {rank = same; A1;}
    {rank = same; B1; B2; B3; B4; B5; B6;}
    {rank = same; W0; W1; W2; W3; W4; W5; W6;}
  }
}

И, используя точечный движок, я получаю:

Current outcome

Мои вопросы:

Могу ли я заставить определенные узлы занять центральную позицию (A1)?

Могу ли я заставить ребра соединяться с определенными местами на границе формы узла (например: в центре слева)?

Может быть, есть лучший способ получить такую ​​древовидную структуру, которая будет иметь центр узлов (я должен учитывать, что следующие слои дерева могут быть довольно сложными)

1 Ответ

0 голосов
/ 14 декабря 2018

Чтобы получить то, что вы хотите, вам нужно

  • определить узлы в том порядке, в каком вы хотите их нарисовать (не обязательно в данном примере, но это хорошая практика)
  • убедитесь, что пустые узлы имеют одинаковый ранг (у вас это уже есть)
  • и соедините эти пустые узлы друг с другом в правильном порядке (это критический элемент здесь)

Применяя эти изменения и просто добавляя ваш код (вам может понравиться это или нет, я так и сделаю), я получаю

digraph G { 
  edge [arrowhead=none];
  nodesep = 1;
  ranksep=0.05;
  splines = ortho;
  rankdir = LR;

  node [ shape="box", width = 2, height = 1, fixedsize=true];
  A1;
  B4 B5 B6 B3 B2 B1;

  node [ shape="point", width = 0, height = 0 ];
  { rank = same; W4 W5 W6 W0 W3 W2 W1 }

  A1 -> W0;
  W4 -> W5 -> W6 -> W0 -> W3 -> W2 -> W1;        /* critical! */
  W1 -> B1;
  W2 -> B2;
  W3 -> B3;
  W4 -> B4;
  W5 -> B5;
  W6 -> B6;
}

, что дает

enter image description here

...