Ketil
Ketil

Reputation: 156

Grouping output edges from graphviz

I'm trying to draw a graph with two kinds of edges, and I want the two kinds of edges to link to each node from opposite sides, as much as possible. I.e. if an edge of type A enters from the left, I want all edges of type B to exit to the right. I know I could specify compass directions, but I'd like graphviz to be able to switch this around to minimize graph clutter.

Is it this, or something similar, possible?

Upvotes: 5

Views: 5766

Answers (2)

Ketil
Ketil

Reputation: 156

My current solution is to replace my old nodes with edges, thus creating two nodes - one for each "port" in the graph. I can then my edges between these "port nodes". Eg. instead of

node1 -> node2 [ sametail="b", samehead = "a" ]

I write

node1_a -> node1_b [ dir=none, style=bold ]
node2_a -> node2_b [ dir=none, style=bold ]

node1_a -> node2_b // if I got head and tail right :-)

Although I don't get boxes for my "nodes", this works okay for my purposes.

Upvotes: 0

marapet
marapet

Reputation: 56466

If you don't want to specify compass points, you'll probably not want to use HTML like labels and ports either.

If you're using dot, you still can achieve something similar by using the samehead and the sametail attributes. From the reference:

Edges with the same head and the same samehead value are aimed at the same point on the head

This lets you group outgoing and incoming edges. Here's a simple example:

digraph g{
    rankdir=LR;
    edge[samehead=h1, sametail=t1];
    a1->b->c1;
    a2->b->c2;
    edge[samehead=h2, sametail=t2];
    a3->b->c3;
    a4->b->c4;
}

graphviz output

This of course is only about grouping heads and tails of edges, and does not guarantee opposite sides for edges of different types.

Upvotes: 5

Related Questions