Jim Tromp
Jim Tromp

Reputation: 31

Graphviz crossing edges

I am trying to avoid the crossing of the lines between 20->40 and 30->70. Does anyone know how to do this? I am using single points to straighten out the edges but I would have expected the rendering engine to avoid these edges to overlap. Here is my dot code:

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
}

I wanted to post an image, but stackoverflow does not allow me to do this... You can see what I mean when you copy the code into: http://stamm-wilbrandt.de/GraphvizFiddle/

I really appreciate your help on this!

Upvotes: 3

Views: 4478

Answers (1)

marapet
marapet

Reputation: 56566

You could give graphviz a hint by adding an invisible edge between p4 an dp5:

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

If you are not able to add invisible edges (dynamic graph generation), make sure nodes which are part of a subgraph do appear first within the subgraph, and therefore avoid upfront node definitions.

In this example, I removed the node definitions in the beginning of the script and inlined the style of the elbow-joint nodes.

Here's the 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

}

Upvotes: 3

Related Questions