= GraphViz =

== Полезные ссылки ==
 * [[http://graphviz.org/Gallery.php| Галерея с примерами и исходниками]] (тыкайте в картинку примера, чтобы получить для неё исходники с комментариями, как именно собиралась картинка).
 * [[http://graphviz.org/content/attrs| Официальный справочник по атрибутам]].
 * [[http://graphviz.org/content/node-shapes| Официальный справочник по формам вершин]].
 * [[http://graphviz.org/content/arrow-shapes| Официальный справочник по стрелкам]].
 * [[http://graphviz.org/Documentation.php| Официальная документация]] -- трудночитаемая.
 * [[http://edutechwiki.unige.ch/en/Graphviz| Несколько простых примеров, хороших пояснений и простенькое введение]]
 * [[http://edutechwiki.unige.ch/en/Conole_and_Fill_learning_taxonomy|Ещё несколько примеров на тему того, насколько по-разному могут выглядеть одни и те же данные в зависимости от немного подкрученных настроек]].
 * [[http://mydebianblog.blogspot.com/2010/01/graphviz.html| Один крайне нетривиальный (но небольшой) пример, очень тщательно разобран]] (ru)
 * [[http://habrahabr.ru/tag/graphviz/| Тэг graphviz на хабре -- там попадаются интересные жизненные примеры]] (ru)

== План рассказа ==
 * Пример: неориентированный граф {{{{#!example
{{{#!GraphViz
graph {
 rankdir=LR; dpi=40;
 a -- b -- c -- d;
 b -- b -- b;
 c -- e;
 e -- {f g} -- h;
 f -- j;
}
}}}
}}}}
 * Как рисовать: {{{
dot -Tx11 file.dot
dot -O -Tpng file.dot
dot -O -Tpdf file.dot
}}}
 * Пример: ориентированный граф {{{{#!example
{{{#!GraphViz
digraph {
 rankdir=LR; dpi=40;
 a -> b -> c -> d;
 b -> b -> b;
 c -> e;
 e -> {f g} -> h;
 f -> j;
}
}}}
}}}}
 * Пример: "cluster" {{{{#!example
{{{#!GraphViz
digraph {
 rankdir=LR; dpi=40;
 a -> b -> c -> d;
 subgraph cluster_1 {
  b -> b -> b;
  c;
 }
 c -> e;
 e -> f -> g;
}
}}}
}}}}
 * Рендереры:
  * dot -- "иерархическая модель": сначала раскладываем вдоль осей, потом минимизируем пересечения
  * fdp -- пружинная модель графа (ищет равновесие сил)
  * neato -- пружинная модель графа (ищет минимум энергии)
  * sfdp -- версия fdp для очень больших графов
  * twopi -- вершины раскладываются по концентрическим кругам согласно расстоянию до корневой вершины
  * circo -- "кольцевая модель": все вершины кладутся на круг, а потом думаем
  * osage -- "иерархия кластеров": в каждом кластере укладываем вершины как прямоугольники, потом проводим рёбра; граф собирается из кластеров из вершин так, как будто каждый кластер -- одна обычная вершина
 * node [shape=]:
  * none, ellipse, point, box, diamond, plaintext, ...
  * record: {{{{#!example
{{{#!GraphViz
graph {
 dpi=40;
 node [shape=record];
 x[label="a | {<p> p | q | r } | c"];
 x -- d;
 x:p -- e;
}
}}}
}}}}
  * HTML: {{{{#!example
{{{#!GraphViz
graph {
 dpi=40;
 x[label=<<table><tr><td>a</td><td>b</td><td port="c">c</td></tr></table>>];
 hello -- x;
 world -- x:c;
}
}}}
}}}}
 * arrow[]:
  * arrowhead=: normal, onormal, olnormal, inv, diamond, dot, none, vee, ...
  * dir=: forward, back, both, none
 * Ещё настройки рёбер:
  * label=
  * len= / weight=
 * Красивости:
  * color, fontcolor, fillcolor
  * style=: filled, dotted, dashed, solid, ...
  * splines=true
 * Пример: subgraph ради общих атрибутов {{{{#!example
{{{#!GraphViz
graph {
 dpi=40;
 A -- B;
 B -- C;
 D -- E;
 subgraph {
 node [fontcolor=red];
 F; I; L;
 }
 subgraph {
 node [style=bold];
 F [style=bold]; J; N;
 }
 subgraph {
 edge [style=invis];
 {F G H} -- {I J K} -- {L M N};
 }
}
}}}
}}}}
 * Ссылки: {{{{#!example
{{{#!GraphViz
digraph {
 dpi=40;
 a[label="Главная",URL="http://kodomo.fbb.msu.wu/wiki/"];
 b[label="Главная по вики",URL="http://kodomo.fbb.msu.ru/wiki/Main"];
 c[label="Главная по безвикию",URL="http://kodomo.fbb.msu.ru/FBB"];
 a -> {b c} [label="Ссылка"];
}
}}}
}}}}
 * Настройки графа:
  * label=...
  * rankdir= LR, RL, TB, BT -- dot; rank=same; (вдоль какой оси раскладывать рёбра)
  * root= -- twopi, circo (кто в центре)
  * sep= (сколько пространства вокруг каждого узла должно быть пустым)
  * splines (рисовать гладкие рёбра, а не ломаные)
  * dim, dimen -- sfdp, fdp, neato (играть в пружинки в N-мерном пространстве, затем проецировать)
  * concentrate (собирать линии вместе)

## vim: set et ts=1 sw=1 sts=1: