开发者

Forcing "main line" nodes into a straight line in Graphviz (or alternatives)

开发者 https://www.devze.com 2023-02-04 01:44 出处:网络
I\'m trying to use Graphviz dot (but am willing to use something else) to generate a graph with a long \"main line\" of nodes, and many small branches. I\'d like the main line to be straight from left

I'm trying to use Graphviz dot (but am willing to use something else) to generate a graph with a long "main line" of nodes, and many small branches. I'd like the main line to be straight from left to right, with the small branches above or below it. However, Graphviz "balances" the two branches, so I end up with a crooked graph.

To illustrate, here's a sketch similar to what I currently get:

Forcing "main line" nodes into a straight line in Graphviz (or alternatives)

And this is what I开发者_JAVA百科 actually want:

Forcing "main line" nodes into a straight line in Graphviz (or alternatives)

Is there any way to force or encourage Graphviz to generate a graph like the second one? I may be able to use "dummy" second branches to have it do a 3-way layout, and then hide/delete the dummies afterward, but if there's a better option that would be preferable.


Here is a solution using the weight attribute of edges:

digraph G {
    rankdir="LR";
    node[width=0.15, height=0.15, shape=point];
    edge[weight=2, arrowhead=none];
    1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8;
    edge[weight=1];
    2 -> 9 -> 10 ;
    5-> 11 -> 12;
}

Result:

Forcing "main line" nodes into a straight line in Graphviz (or alternatives)


A second solution using the group attribute of nodes - again a directed graph:

From the graphviz dot reference:

If the end points of an edge belong to the same group, i.e., have the same group attribute, parameters are set to avoid crossings and keep the edges straight.

So here we go:

digraph g{
    rankdir="LR";
    node[width=0.15, height=0.15, shape=point, group=main];
    edge[arrowhead=none];
    1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8;
    node[group=branches];
    2 ->  9 -> 10;
    5 -> 11 -> 12;
}

Output is exactly the same as in my first answer.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号