在Graphviz(或替代工具)中强制将“主线”节点排成一条直线

26

我想使用Graphviz dot(但愿意使用其他工具)生成一张有长的“主线”节点和许多小分支的图。我希望主线从左到右是直的,而小分支在其上方或下方。然而,Graphviz会“平衡”两个分支,所以最终得到了一个曲折的图。

为了说明问题,这里有一个类似于我目前得到的草图:

Current Graph

而这才是我真正想要的:

Wanted graph

是否有任何方法可以强制或鼓励Graphviz 生成像第二个图那样的图形?我可以使用“虚拟”第二分支来进行3路布局,然后在之后隐藏/删除这些虚拟分支,但如果有更好的选择,那就更好了。

2个回答

41

以下是使用边缘权重属性的解决方案:

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;
}

结果:

graphivz


看起来这样做就可以了,但似乎需要图是有向的。我的定义为无向,但没有特别的原因需要它是无向的,所以应该可以工作。谢谢。 - Chad Birch
我不确定这是否可以作为一个无向图实现,但我很高兴这对你有用。 - marapet
3
创建无向图的最佳方法是使用有向图,但设置 edge[dir="none"]。另一种选择是 dir="back",它使用 -> 方向进行图形布局,但箭头指向相反方向。 - Sam Harwell

38

使用节点的group属性的另一个解决方案——再次使用有向图:

来自graphviz点参考:

如果边的端点属于同一组,即具有相同的组属性,则设置参数以避免交叉并使边保持直线。

所以我们开始吧:

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;
}

输出与我的第一个答案完全相同。


1
谢谢,我很感激你提供了另一种解决方案,尽管我已经接受了另一个。我对Graphviz还是比较新的,所以看到实现这样事情的可能方法很不错。 - Chad Birch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接