Question: 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?

Answer: 
If you don't want to specify compass points, you'll probably not want to use [HTML like labels](http://www.graphviz.org/doc/info/shapes.html#html) and [ports](http://www.graphviz.org/doc/info/attrs.html#k:portPos) 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](https://i.stack.imgur.com/wVdQD.png)

This of course is only about grouping heads and tails of edges, and does not guarantee opposite sides for edges of different types.
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.