Вариация @ ответа Грега , это немного более компактно и менее зависит от порядка операторов в графе.
расквитаться:
- Он вообще не использует
rank=same
- Как правило, исходная организация немного более древовидна, что облегчает редактирование.
- Только 2 небольших изменения, чтобы показать / скрыть все узлы, если это необходимо.
- Неважно, в каком порядке объявлены ребра, если родитель и потомки находятся на одной строке.
Даунсайд:
Как и в FAQ , балансировка дерева по-прежнему зависит от скрытых узлов.
graph calc {
graph[nodesep=0.25, ranksep=0.3, splines=line];
node [fontname = "Bitstream Vera Sans", fontsize=14,
style=filled, fillcolor=lightblue,
shape=circle, fixedsize=true, width=0.3];
// layout all nodes 1 row at a time
// order matters on each line, but not the order of lines
"+";
"/", am, "**";
// or can be more spread out if you need to . . .
n1 [label="1"];
dm;
n2 [label="2"];
"*", bm, "3", "4", cm, "5";
// make 'mid' nodes invisible
am, bm, cm, dm [style=dotted, label=""];
// layout all visible edges as parent -> left_child, right_child
"+" -- "/","**";
"/" -- "*","3"
"**"-- "4","5";
"*" -- n1, n2;
// link mid nodes with a larger weight:
edge [style=dotted, weight=10];
"+" -- am;
"/" -- bm;
"**"-- cm;
"*" -- dm;
}
Что приводит к:
Это техника, которую я обычно использую, когда мне нужно нарисовать дерево.
Я не часто использую gvpr , потому что он не очень хорошо работает в средах, где я часто хочу использовать график ( sphinx , doxygen , так далее.).
Но если вы можете использовать стандартный конвейер для создания своего графа, и вам все равно, как выглядит исходный граф, то gvpr - ваш друг.