【问题标题】:Forcing "main line" nodes into a straight line in Graphviz (or alternatives)在 Graphviz(或替代方案)中将“主线”节点强制为直线
【发布时间】:2011-06-07 23:02:02
【问题描述】:

我正在尝试使用 Graphviz dot(但我愿意使用其他东西)来生成一个带有长“主线”节点和许多小分支的图。我希望主线从左到右笔直,上面或下面有小分支。但是,Graphviz “平衡”了这两个分支,所以我最终得到了一个弯曲的图形。

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

这就是我真正想要的:

有什么方法可以强制或鼓励 Graphviz 生成类似于第二个的图形?我也许可以使用“虚拟”第二个分支让它进行 3 向布局,然后隐藏/删除虚拟对象,但如果有更好的选择,那就更好了。

【问题讨论】:

    标签: graphviz dot


    【解决方案1】:

    这是一个使用边的weight属性的解决方案:

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

    结果:

    【讨论】:

    • 这似乎可以解决问题,但似乎需要对图形进行定向。我的被​​定义为无向,但没有特别的理由需要它,所以应该可以。谢谢。
    • 我不确定这是否可以作为无向图,但我很高兴这对你有用。
    • 创建无向图的最佳方法是使用有向图但设置edge[dir="none"]。另一个选项是dir="back",它使用-> 方向进行图形布局,但绘制指向相反方向的箭头。
    【解决方案2】:

    使用节点的 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;
    }
    

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

    【讨论】:

    • 谢谢,感谢您提供替代解决方案,即使我已经接受了另一个解决方案。我对 Graphviz 还是很陌生,所以很高兴看到实现此类目标的可能方法。
    猜你喜欢
    • 1970-01-01
    • 2020-06-02
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多