嵌套的graphviz树?

时间:2018-07-13 14:34:54

标签: graphviz

TL; DR:graphviz中是否有一些用于创建树的缩写,不需要重新输入节点名称?

我正在尝试使用graphviz的twopi工具创建一个思维导图。为了避免一遍又一遍地重写相同的标签(或使用晦涩的速记),我试图使用嵌套花括号。

基本上,我希望这里的两个子图具有相同的结构:

digraph example {            
        subgraph AA {     
                root -> {a b c}
                a -> {a1 a2 a3}
                b -> {b1 b2 b3}
                c -> {c1 c2 c3}
        }
        subgraph XX {
                _root -> {
                        _a -> { _a1 _a2 _a3 }
                        _b -> { _b1 _b2 _b3 }
                        _c -> { _c1 _c2 _c3 }
                }
        }
}

但是,第一个具有我想要的层次结构,而第二个具有来自根节点的意外连接。编译为twopi -Tpng example.dot -o example.png

enter image description here

第一种形式可以使用简短的符号名,但是当标签包含实际文本时,文本文件很快就会变得难以阅读。

第二种形式会有所帮助,但是显然我了解了graphviz中分组的作用。

是否存在一些语法,可以避免在subgraph XX中尝试重复节点名?

1 个答案:

答案 0 :(得分:1)

我很确定没有。来自https://www.graphviz.org/doc/info/lang.html

  

edge语句允许在edge运算符的左侧和右侧都有子图。发生这种情况时,将从左侧的每个节点到右侧的每个节点创建一条边。

这意味着您必须重复某事,以使边缘从树中的一个分支(包括根)到该分支的一切都没有。我通常会重复最容易编写的节点。

我认为这不会使您更快乐,但这是一种仅重复根节点的方法:

<!DOCTYPE html>
<meta charset="utf-8">
<body>
<script src="https://d3js.org/d3.v5.js"></script>
<script src="https://unpkg.com/viz.js@1.8.2/viz.js" type="javascript/worker"></script>
<script src="https://unpkg.com/d3-graphviz@2.4.2/build/d3-graphviz.js"></script>
<div id="graph" style="text-align: center;"></div>
<script>

var dotSrc = `
digraph example {            
    subgraph AA {     
        root -> {a b c}
        a -> {a1 a2 a3}
        b -> {b1 b2 b3}
        c -> {c1 c2 c3}
    }
    subgraph XX {
        _root -> _a -> { _a1 _a2 _a3 }
        _root -> _b -> { _b1 _b2 _b3 }
        _root -> _c -> { _c1 _c2 _c3 }
    }
}
`;

d3.select("#graph").graphviz()
  .engine("twopi")
  .renderDot(dotSrc);

</script>