【问题标题】:Graphviz nodes renderingGraphviz 节点渲染
【发布时间】:2014-11-03 02:12:33
【问题描述】:

我有一个简单的 graphviz 图表,如下图所示:

digraph G {
        "Model" -> "Task";
        "Task" -> "Worker 1" -> "Sink";
        "Task" -> "Worker 2" -> "Sink";
        "Task" -> "Worker 3" -> "Sink";
}       

在sink和task节点之间添加和边,图输出如下图所示:

    "Sink" -> "Model";

如何添加这条边并保持第一张图片中显示的原始对称节点布局?

【问题讨论】:

    标签: graphviz


    【解决方案1】:

    (已编辑以改进我的原始答案)

    基于How to control subgraphs' layout in dot? 的答案,如果我们首先使用dot 布置核心有向图,然后我们可以使用neato 添加额外的边。 neato 允许使用 -n 参数固定已定义位置的节点,因此可以执行类似的操作(其中 symmetric.dot 包含原始 GraphViz 有向图并添加了 graph [splines = true]):

    #!/bin/bash
    dot -Tdot symmetric.dot >symmetric1.dot
    neato -n2 -Tpng symmetric1.dot -osymmetric1.png
    sed 's/^}/"Sink" -> "Model";}/' <symmetric1.dot  >symmetric2.dot
    neato -n2 -Tdot symmetric2.dot >symmetric3.dot
    neato -n2 -Tpng symmetric3.dot -osymmetric3.png
    

    这个脚本:

    1. 使用dot 将原始有向图布局到新的.dot 文件中。
    2. 使用neato -n2 绘制原始有向图。 -n2 选项防止neato 移动已经有位置的节点。
    3. 使用sed 插入"Sink" -&gt; "Model" 边。
    4. 使用neato -n2 布置新边缘(这是唯一一个没有定义pos,因此唯一一个没有固定)并将其绘制为.png 文件。

    symmetric1.png 看起来像这样:

    ... 和带有附加边的symmetric3.dot 如下所示:

    【讨论】:

    • 感谢您的回答,我想要一个有向图结构,但看起来 neato 无法实现这一点
    • @MigueldeVal-Borro 我已经更新了我的答案以首先使用dot,并引用了另一个问题和答案,其中答案表明我们不必在第一步使用neato
    • 谢谢@Simon,看起来很棒!
    猜你喜欢
    • 2020-01-03
    • 1970-01-01
    • 1970-01-01
    • 2012-01-23
    • 2019-12-08
    • 2018-10-26
    • 2021-10-04
    • 2022-08-23
    • 2018-08-26
    相关资源
    最近更新 更多