Graphviz: рисование узлов в заданном порядке, чтобы правильно нарисовать дерево - PullRequest
0 голосов
/ 16 февраля 2019

Я пытаюсь нарисовать дерево, но у меня проблема со следующим подходом:

  • Использование «невидимых» узлов для соединения уровней дерева,
  • Использование «ранга»то же самое 'рисовать узлы на одном уровне

Используя этот код, я получаю следующий результат

graph G{
edge [arrowhead = none];
splines = ortho;
rankdir = LR;

node [ shape="box" fixedsize = true width = 4 height = 1];

{ rank = same; "C" }

{ rank = same; 
"B" 
"A"
}

{ rank = same; 
"F" 
"D" 
"E" 
}
node [ shape="cricle" width = 0 height = 0 style=invis];

{ rank = same; 
"B_Inv_Parent_1"
"C_Inv_Even_Children_0"
"A_Inv_Parent_1" 
}

{ rank = same; 
"F_Inv_Parent_2"
"D_Inv_Parent_2" 
"A_Inv_Even_Children_1"
"E_Inv_Parent_2" 
}

"C" -- "C_Inv_Even_Children_0";
"B_Inv_Parent_1" -- "C_Inv_Even_Children_0" -- "A_Inv_Parent_1";
"B_Inv_Parent_1" -- "B";
"A_Inv_Parent_1" -- "A";

"B" -- "F_Inv_Parent_2";
"F_Inv_Parent_2" -- "F";

"A" -- "A_Inv_Even_Children_1";
"D_Inv_Parent_2"  -- "A_Inv_Even_Children_1" -- "E_Inv_Parent_2";
"D_Inv_Parent_2" -- "D";
"E_Inv_Parent_2" -- "E";
}

I get following result

У меня проблема в третьемуровень: D нарисован в верхней части рисунка, что делает соединение с E не идеальным.Я хотел бы получить те же результаты, что и с C , B и A .

Я думаю, что проблема связана с порядком определения узлов, однако мне не удается заставить его работать в любом порядке, в котором я их определяю.

Может кто-нибудь заметить другую проблему с моим кодом ипредложить исправить?

1 Ответ

0 голосов
/ 17 февраля 2019

Я очистил ваш код и перестроил несколько строк - в конце концов, я думаю, что введение

F_Inv_Parent_2 -- D_Inv_Parent_2  -- A_Inv_Even_Children_1 -- E_Inv_Parent_2;

было ключевым.Вам не нужно определять стрелки ребер, поскольку у вас нет ориентированного графа, и есть опечатка в shape="cricle".

Здесь моя отредактированная версия

graph G
{
    splines = ortho;
    rankdir = LR;

    // node definitions
    node [ shape="box" fixedsize = true width = 4 height = 1];
    C
    { rank = same; B A }
    { rank = same; F D E }

    node [ shape="point" width = 0 height = 0 ];
    { rank = same; 
        B_Inv_Parent_1
        C_Inv_Even_Children_0
        A_Inv_Parent_1 }
    { rank = same;
        F_Inv_Parent_2
        D_Inv_Parent_2
        A_Inv_Even_Children_1
        E_Inv_Parent_2 }

    // edges
    C -- C_Inv_Even_Children_0;

    B_Inv_Parent_1 -- C_Inv_Even_Children_0 -- A_Inv_Parent_1;

    B_Inv_Parent_1 -- B -- F_Inv_Parent_2;
    A_Inv_Parent_1 -- A -- A_Inv_Even_Children_1;

    F_Inv_Parent_2 -- D_Inv_Parent_2  -- A_Inv_Even_Children_1 -- E_Inv_Parent_2;

    F_Inv_Parent_2 -- F;
    D_Inv_Parent_2 -- D;
    E_Inv_Parent_2 -- E;
}

ирезультат:

enter image description here

РЕДАКТИРОВАТЬ: Возможно, я неправильно понял ваше намерение, как вы хотите подключить третий уровень - если так, замените

F_Inv_Parent_2 -- D_Inv_Parent_2  -- A_Inv_Even_Children_1 -- E_Inv_Parent_2;

с

F_Inv_Parent_2 -- D_Inv_Parent_2[ style = invis ];
D_Inv_Parent_2  -- A_Inv_Even_Children_1 -- E_Inv_Parent_2;

, который дает вам

enter image description here

РЕДАКТИРОВАТЬ № 2, в ответ на ваш комментарий:

Добавление веса к краю помогает выправить его - я даю полный код, даже если изменились только две строки (плюс комментарии), для упрощения копирования и вставки:

graph G
{
    splines = ortho;
    rankdir = LR;

    // node definitions
    node [ shape="box" fixedsize = true width = 4 height = 1];
    C
    { rank = same; B A }
    { rank = same; F D E }

    node [ shape="point" width = 0 height = 0 ];
    { rank = same; 
        B_Inv_Parent_1
        C_Inv_Even_Children_0
        A_Inv_Parent_1 }
    { rank = same;
        F_Inv_Parent_2
        D_Inv_Parent_2
        A_Inv_Even_Children_1
        E_Inv_Parent_2 }

    // edges
    C -- C_Inv_Even_Children_0;

    B_Inv_Parent_1 -- C_Inv_Even_Children_0 -- A_Inv_Parent_1;

    // add extra weight to the continouous connection between four levels:
    B_Inv_Parent_1 -- B -- F_Inv_Parent_2 -- F[ weight = 10 ];
    // no weight here:
    A_Inv_Parent_1 -- A -- A_Inv_Even_Children_1;

    F_Inv_Parent_2 -- D_Inv_Parent_2[ style = invis ];
    D_Inv_Parent_2  -- A_Inv_Even_Children_1 -- E_Inv_Parent_2;

    // F_Inv_Parent_2 -- F;  ### moved
    D_Inv_Parent_2 -- D;
    E_Inv_Parent_2 -- E;
}

Что дает вам потерянныепрямая линия от B через F_Inv_Parent_2 до F, которая на самом деле является внуком:

enter image description here

...