= 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: