Как получить сбалансированные диаграммы из графвиза? - PullRequest
1 голос
/ 24 июня 2010

Есть ли в Graphviz параметр для создания сбалансированных диаграмм, например:

правильная диаграмма http://img3.imageshack.us/img3/6423/testaah.png

Когда диаграмма более сложная, как показано ниже - она ​​не сбалансирована, как указано выше4 ниже **).

неправильно сбалансирован http://img51.imageshack.us/img51/6632/test2b.png

Код для генерации второй диаграммы:

graph
{
  n1 [label="+"];
  n1 -- n2;
  n2 [label="/"];
  n2 -- n3;
  n3 [label="*"];
  n3 -- n4;
  n4 [label="1"];
  n3 -- n5;
  n5 [label="2"];
  n2 -- n6;
  n6 [label="3"];
  n1 -- n7;
  n7 [label="**"];
  n7 -- n8;
  n8 [label="4"];
  n7 -- n9;
  n9 [label="5"];
}

Ответы [ 3 ]

2 голосов
/ 03 июля 2010

Вы можете «ввести новые невидимые узлы, чтобы перебалансировать макет». (см. http://www.graphviz.org/content/FaqBalanceTree). Таким образом, ваш код становится:

graph
{
  n1 [label="+"];
  n2 [label="/"];
  n1 -- n2;
  n1b1 [label="", width=.1, style=invis]
  n1 -- n1b1 [style=invis]  
  n1b2 [label="", width=.1, style=invis]
  n1 -- n1b2 [style=invis]  
  n1b3 [label="", width=.1, style=invis]
  n1 -- n1b3 [style=invis]  
  n7 [label="**"];
  n1 -- n7;
  { rank=same n2 -- n1b1 -- n1b2 -- n1b3 -- n7 [style=invis] }

  n3 [label="*"];
  n2 -- n3;
  n2b1 [label="", width=.1, style=invis]
  n2 -- n2b1 [style=invis]
  n6 [label="3"];
  n2 -- n6;
  { rank=same n3 -- n2b1 -- n6 [style=invis] }

  n8 [label="4"];
  n7 -- n8;
  n7b1 [label="", width=.1, style=invis]
  n7 -- n7b1 [style=invis]
  n9 [label="5"];
  n7 -- n9;
  { rank=same n8 -- n7b1 -- n9 [style=invis] }

  n3 -- n4;
  n4 [label="1"];
  n3 -- n5;
  n5 [label="2"];
}

С этим выводом:

alt text

1 голос
/ 13 января 2011

Для этого конкретного примера все, что вам нужно, это ослабить вес ребер между верхними 3 ребрами:

graph g{    
  n1 [label="+"];
  n1 -- n2 [weight=0];
  n2 [label="/"];
  n2 -- n3;
  n3 [label="*"];
  n3 -- n4;
  n4 [label="1"];
  n3 -- n5;
  n5 [label="2"];
  n2 -- n6;
  n6 [label="3"];
  n1 -- n7 [weight=0];
  n7 [label="**"];
  n7 -- n8;
  n8 [label="4"];
  n7 -- n9;
  n9 [label="5"];
}

Выход:

graphviz output

В более сложных случаях, когда трудно управлять невидимыми узлами, ребрами и заданными весами, вы можете попробовать скрипт gvpr Эмдена Р. Ганснера для размещения двоичных деревьев, как описано в ответе на этот вопрос. .

0 голосов
/ 11 января 2018

Вариация @ ответа Грега , это немного более компактно и менее зависит от порядка операторов в графе.

расквитаться:

  1. Он вообще не использует rank=same
  2. Как правило, исходная организация немного более древовидна, что облегчает редактирование.
  3. Только 2 небольших изменения, чтобы показать / скрыть все узлы, если это необходимо.
  4. Неважно, в каком порядке объявлены ребра, если родитель и потомки находятся на одной строке.

Даунсайд:

Как и в 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;
}

Что приводит к:

balanced tree graph

Это техника, которую я обычно использую, когда мне нужно нарисовать дерево.

Я не часто использую gvpr , потому что он не очень хорошо работает в средах, где я часто хочу использовать график ( sphinx , doxygen , так далее.). Но если вы можете использовать стандартный конвейер для создания своего графа, и вам все равно, как выглядит исходный граф, то gvpr - ваш друг.

...