Как я могу разбить широкий макет в графическом точечном орграфе (rankdir LR) - PullRequest
0 голосов
/ 10 января 2019

С помощью python я пытаюсь сгенерировать длинный граф, где всегда один узел указывает на следующий. Это заканчивается наличием длинной улитки узлов (rankdir LR). Однако Я хочу разбить его после определенной ширины, числа или узлов . Как этого достичь?

graph = gv.Digraph(format='svg')
graph.graph_attr.update({'rankdir': 'LR'})

graph.node('a', 'A')
graph.node('b', 'B')
graph.node('c', 'C')
graph.node('d', 'D')
graph.node('e', 'E')
graph.node('f', 'F')
...

graph.edges(['ab', 'bc', 'cd', 'de', 'ef', ...])

Выход:

all items in one row

Однако я хочу (или похожий):

items arranged in two rows with keeping the connection

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

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

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


Обновление: Я изменил код для ребер в соответствии с комментарием @vaettchen:

graph.edge('a', 'b', None, {'weight':'5'})
graph.edge('b', 'c', None, {'weight':'5'})
graph.edge('d', 'e', None, {'weight':'5'})
graph.edge('e', 'f', None, {'weight':'5'})

graph.edge('c', 'd', None, {'weight':'1'})
graph.edge('a', 'd', None, {'style':'dashed', 'rank':'same'})

К сожалению, результат теперь выглядит следующим образом (стиль «пунктир» вместо «invis» для лучшей видимости): enter image description here

"rank": "same", кажется, ничего не меняет. Также применительно к узлам A и D.

1 Ответ

0 голосов
/ 13 января 2019

Это должен быть комментарий, а не ответ, так как он не затрагивает проблему с питоном, и я думаю, вы также ищете что-то более «автоматическое» - но, возможно, оно дает некоторые идеи; и, как никто другой не подхватывает это, вот чистое предложение графвиза:

digraph so 
{
    // graph attributes
    rankdir = LR;       // horizontal graph
    splines = ortho     // edges with "corners"

    // default/initial node style
    node[ shape = box ];

    // nodes where the "new lines" begin
    // connected invisibly to keep them in order
    { rank = same; A ->  E ->  I[ style = invis ] }

    // nodes that are to be in one line
    // extra weight needed to keep the edges straight
    edge[ weight = 5 ];
    A -> B -> C -> D;
    E -> F -> G -> H;
    I -> J -> K -> etc;

    // edges connecting the graph elements over the lines
    edge[ weight = 1 ];
    D -> E;
    H -> I;
}

выходы

enter image description here

...