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
:
第一种形式可以使用简短的符号名,但是当标签包含实际文本时,文本文件很快就会变得难以阅读。
第二种形式会有所帮助,但是显然我了解了graphviz中分组的作用。
是否存在一些语法,可以避免在subgraph XX
中尝试重复节点名?
答案 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>