графвиз широкая плоская древовидная структура с прямыми углами - PullRequest
0 голосов
/ 02 октября 2018

У меня есть монстр дерева, который я пытаюсь визуализировать в графике, используя точку.В частности, я хочу использовать ортогональные ветви с общими ребрами, потому что некоторые из моих узлов имеют степень выхода ~ 20 (максимум, большинство ближе к 3-5).

То, что я хочу, это что-то вроде этого (простите за ужасную работу рисования):

desired

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

digraph {
    splines="ortho"
    rankdir="LR"
    concentrate="true"
    aa [shape=none, label="", width=0, height=0]
    A
    B
    C
    D
    E
    F
    G
    H
    I
    A -> aa [arrowhead="none"]
    aa -> B
    aa -> C
    aa -> D
    aa -> E
    aa -> F
    aa -> G
    aa -> H
    aa -> I
}

Но то, что я получаю, это:

broken

Этот подход прекрасно работает с 3 или около того дочерними узлами, но ломаетвниз сразу в большем случае использования.Включение или выключение «концентрата» не оказывает большого влияния (очень небольшое улучшение).

Мой текущий план - отказаться от этого подхода и попробовать использовать узлы стиля «запись» и сложить их вручную, но этоБудет много работы, так что я надеюсь, что у кого-то есть лучшее предложение.Я немного гибок в том, как это выглядит, в основном я просто хочу визуализировать дерево с ~ 600 узлами в виде гигантского изображения, подобного этому

Я на самом деле генерирую это из python, в случае, если это имеет значение (Я бы хотел использовать другую библиотеку Python, если бы это помогло)

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

digraph {
    splines="ortho"
    rankdir="LR"
    nodesep=0.3
    aa [shape=box, label="", width=0, height=5.6]
    node [shape=box, height=0.5]
    A
    B
    C
    D
    E
    F
    G
    H
    I
    A -> aa [arrowhead="none"]
    aa -> B [headport="w"]
    aa -> C [headport="w"]
    aa -> D [headport="w"]
    aa -> E [headport="w"]
    aa -> F [headport="w"]
    aa -> G [headport="w"]
    aa -> H [headport="w"]
    aa -> I [headport="w"]
}

kinda_broken

В этомВ этом случае у меня N = 8 узлов с высотой ч и разнесением с , поэтому я делаю высоту коробки (N-1)*(h+s), чтобы покрыть ее до середины ящиков сверху иснизу, но у меня свисает свисание, потому что я не могу должным образом контролировать точку хвоста.Не уверен, насколько хорошо это будет масштабироваться до большего дерева

РЕДАКТИРОВАТЬ 2: Как и ожидалось, это не работает вообще на более сложном графике, потому что я не могу узнать, как далеко друг от друга расположены поля справабудет (они разнесены, чтобы освободить место для других узлов)

1 Ответ

0 голосов
/ 03 октября 2018

Ладно, немного покопавшись, я нашел работоспособное решение.Используя "ortho", "lines" или "polyline" в качестве метода сплайна, вы можете создать один (невидимый) "объединенный" узел на исходящее состояние следующим образом:

 digraph {
    splines="ortho"
    rankdir="LR"

    node [shape=box]
    A B C D E F G H I

    node [shape=none, label="", width=0.0, height=0.0]
    {
        rank=same;
        bb->cc->dd->ee->ff->gg->hh->ii [arrowhead="none"]
    }

    A->bb [arrowhead="none"]

    bb -> B
    cc -> C
    dd -> D
    ee -> E
    ff -> F
    gg -> G
    hh -> H
    ii -> I
}

Который производит это:

kind of working

Этот тип масштабируется до больших графиков и выглядит хорошо (я считаю, что полилинии - лучший метод сплайна для большого дерева),Основная раздражающая часть заключается в том, что вы должны решить, на каком соединении указать точку «А» (он не может просто указывать где-то на линии или в середине линии).Это может создать некоторые головные боли с большими деревьями

...