Графвиз: плоский горизонтальный график с изогнутыми краями? - PullRequest
1 голос
/ 13 января 2020

У меня есть этот код

graph G {
node [shape=circle]
rankdir=LR;
1 -- 10;
2 -- 9;
3 -- 8;
4 -- 7;
5 -- 6;
}

, но я хочу, чтобы вершины 1 ... 10 были расположены в плоском горизонтальном ряду, а затем с соединительными ребрами в виде дуг (чередование сверху и снизу), соединяющих 1 до 10, от 2 до 9 и т. д. c. Мой код только производит стек вершин и их ребер.

Ответы [ 2 ]

2 голосов
/ 13 января 2020

Сначала нужно указать graphviz, что вы хотите, чтобы узлы были в ряд. Только тогда вы можете ввести второй набор ребер так, как вам нравится. Существует очень ограниченный контроль над тем, как graphviz размещает края; Метод проб и ошибок привел меня к приведенному ниже решению, которое является лучшим, которое я смог найти.

См. Комментарии в коде:

graph so 
{
    node [shape=circle]
    rankdir=LR;

    // We put all nodes in one row
    // We need the weight to keep them straight
    // Edge style is invisible, so that they are not in the way of your edges
    1 -- 2 -- 3 -- 4 -- 5 -- 6 -- 7 -- 8 -- 9 -- 10[ weight = 10, style = invis ];

    1:ne -- 10:nw;          // added ports to force node above
    2 -- 9;                 // the rest is graphviz' decision
    3 -- 8;
    4 -- 7;
    5 -- 6;
}

дает вам

enter image description here

1 голос
/ 14 января 2020

Попробуй это. Невидимые края должны обеспечивать порядок в пределах ранга. Двойной 5 - 6 край должен обеспечить ar c, в противном случае край был бы прямым. Я попробовал это на viz- js .com. Чередование верхних и нижних дуг сильно зависит от порядка ребер. Поскольку он очень чувствительный, недокументированный и, вероятно, склонен к незначительному изменению версии, я не рекомендую его в качестве производственного решения, так как механизм DOT не подходит для таких задач. Для одноразовой документации достаточно и соответствует вашим требованиям.

graph G {
splines=splines;
node [shape=circle];
edge [constraint=false];
rankdir=LR;
1 -- 10;
3 -- 8;
2 -- 9;
1 -- 2 [style=invis, constraint=true];
2 -- 3 [style=invis, constraint=true];
3 -- 4 [style=invis, constraint=true];
4 -- 5 [style=invis, constraint=true];
5 -- 6 [style=invis];
4 -- 7;
5 -- 6 [constraint=true];
6 -- 7 [style=invis, constraint=true];
7 -- 8 [style=invis, constraint=true];
8 -- 9 [style=invis, constraint=true];
9 -- 10 [style=invis, constraint=true];
}

viz-js.com screenshot

...