GraphViz
Полезные ссылки
Галерея с примерами и исходниками (тыкайте в картинку примера, чтобы получить для неё исходники с комментариями, как именно собиралась картинка).
Официальная документация – трудночитаемая.
Несколько простых примеров, хороших пояснений и простенькое введение
Один крайне нетривиальный (но небольшой) пример, очень тщательно разобран (ru)
Тэг graphviz на хабре -- там попадаются интересные жизненные примеры (ru)
План рассказа
Пример: неориентированный граф
{{{#!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
Пример: ориентированный граф
{{{#!GraphViz digraph { rankdir=LR; dpi=40; a -> b -> c -> d; b -> b -> b; c -> e; e -> {f g} -> h; f -> j; } }}}
Пример: "cluster"
{{{#!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:
{{{#!GraphViz graph { dpi=40; node [shape=record]; x[label="a | {<p> p | q | r } | c"]; x -- d; x:p -- e; } }}}
HTML:
{{{#!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 ради общих атрибутов
{{{#!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}; } } }}}
Ссылки:
{{{#!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 (собирать линии вместе)