Ребра пересечения Graphviz

Я пытаюсь избежать пересечения линий между 20->40 и 30->70. Кто-нибудь знает как это сделать? Я использую отдельные точки для выравнивания краев, но я ожидал, что механизм рендеринга избежит перекрытия этих краев. Вот мой точечный код:

digraph {
graph [splines="ortho", nodesep = "1", overlap = false];
node [shape=rectangle, color=lightgrey, style=filled ];

10
20
30
40
50
60
70
80
90


node[shape=none, width=0, height=0 label=""];
edge[dir=none];

{rank=same;
p1->10
10->p2
}

p1->20
p2->30


{rank=same;
p3->40
40->p4
}

p3->50
p4->60


{rank=same;
p5->70
70->p6
}

p5->80
p6->90


20->40
30->70
}

Я хотел опубликовать изображение, но stackoverflow не позволяет мне это сделать... Вы можете понять, что я имею в виду, когда скопируете код в: http://stamm-wilbrandt.de/GraphvizFiddle/

Я очень ценю вашу помощь в этом!


person Jim Tromp    schedule 24.09.2014    source источник
comment
+1 за ссылку на GraphvizFiddle - не знал об этом инструменте, отличная вещь!   -  person marapet    schedule 24.09.2014


Ответы (1)


Вы можете дать графвизу подсказку, добавив невидимое ребро между p4 и dp5:

{
    rank=same;
    p3 -> 40;
    40 -> p4;
    p4 -> p5 [style=invis]; // new invisible edge
    p5 -> 70;
    70 -> p6;
}

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

В этом примере я удалил определения узлов в начале скрипта и встроил стиль узлов локтевого сустава.

Вот GraphvizFiddle

digraph {
graph [splines="ortho", nodesep = "1", overlap = false];
node [shape=rectangle, color=lightgrey, style=filled ];

//node[shape=none, width=0, height=0, label=""];
edge[dir=none];

{
 rank=same;
 p1[shape=none, width=0, height=0, label=""];
 p2[shape=none, width=0, height=0, label=""];
 p1->10
 10->p2
}

p1->20
p2->30

{
 rank=same;
 p3[shape=none, width=0, height=0, label=""];
 p4[shape=none, width=0, height=0, label=""];
 p3->40
 40->p4
}


p3->50
p4->60

{
 rank=same;
 p5[shape=none, width=0, height=0, label=""];
 p6[shape=none, width=0, height=0, label=""];
 p5->70
 70->p6
}

p5->80
p6->90


20->40
30->70

}
person marapet    schedule 24.09.2014
comment
Спасибо, это работает для этого статического примера! Как я могу заставить это работать в динамическом режиме? Я не знаю заранее, на каком уровне будут отображаться узлы, поэтому динамическое добавление скрытых ребер кажется сложным... очень ценю вашу помощь в этом! - person Jim Tromp; 24.09.2014
comment
Я с тобой о невидимых гранях! Я добавил более общее решение, надеюсь, оно сработает в ваших реальных случаях. - person marapet; 25.09.2014
comment
Становимся ближе! Таким образом, отсутствие определений узлов делает эту работу... К сожалению, мне нужны определенные узлы, потому что высота и ширина узлов вычисляются на основе размера метки... - person Jim Tromp; 25.09.2014
comment
В приведенном выше примере узлы имеют точно такие же атрибуты (высота, ширина, метка), что и раньше, с той лишь разницей, что они не перечислены первыми. Если у вас есть предварительно рассчитанная ширина/высота (внешняя по отношению к graphviz), вы все равно можете сначала объявить узел с его атрибутами, просто сделайте это в подграфе, который он появляется первым (например, узлы p1, p2,...). - person marapet; 25.09.2014
comment
Отлично, я понял это после вашего предыдущего комментария. Еще раз спасибо за все, что вы помогаете. - person Jim Tromp; 26.09.2014