http://lib.custis.ru/api.php?action=feedcontributions&user=%D0%9A%D0%B0%D1%80%D1%82%D0%BE%D0%B3%D1%80%D0%B0%D1%84&feedformat=atom
CustisWiki - Вклад участника [ru]
2024-03-29T00:30:10Z
Вклад участника
MediaWiki 1.26.4
http://lib.custis.ru/index.php?title=Graphviz&diff=11159
Graphviz
2009-09-01T08:04:19Z
<p>Картограф: /* Установка GraphViz */</p>
<hr />
<div>'''Graphviz''' — это разработанный специалистами лаборатории AT&T пакет утилит по автоматической визуализации графов, заданных в виде текстового описания. Пакет распространяется с открытыми исходными файлами и работает на всех операционных системах, включая Windows, Linux/Unix, Mac OS. Самой интересной программой пакета является «dot», автоматический визуализатор направленных графов, который принимает на вход текстовый файл со структурой графа, а на выходе формирует граф в виде графического, векторного или текстового файла.<br />
<br />
= Быстрый старт =<br />
<br />
Входной файл для программы «DOT» является обычным текстовым файлом на специальном языке разметки графа. Структура файла очень простая, например,<br />
<br />
digraph G{ <br />
Рождение->Юность->Зрелость->Старость->Смерть;<br />
Юность->Смерть;<br />
Зрелость->Смерть;<br />
}<br />
<br />
на выходе будет<br />
<br />
<graph> <br />
digraph G{<br />
Рождение->Юность->Зрелость->Старость->Смерть;<br />
Юность->Смерть;<br />
Зрелость->Смерть;<br />
}<br />
</graph><br />
<br />
Программа «Dot» сама распознает все связи графа и упорядочит его таким образом, чтобы было наименьшее количество пересечений.<br />
<br />
Чтобы использовать «dot»-графы в [[{{SITENAME}}]], используйте следующий синтаксис:<br />
<br />
<nowiki><graph><br />
digraph G{ <br />
Рождение->Юность->Зрелость->Старость->Смерть;<br />
Юность->Смерть;<br />
Зрелость->Смерть;<br />
}<br />
</graph></nowiki><br />
<br />
Если у вас узлы поименованы словосочетаниями, заключите их в кавычки, т. е.<br />
<br />
<nowiki><graph><br />
digraph G{<br />
"Полет фантазии"->"Расход горючего";<br />
}<br />
</graph></nowiki><br />
<br />
Поздравляем! Теперь вы способны рисовать графы в [[{{SITENAME}}]]. Остальной текст будет посвящен некоторым тонкостям использования [[Graphviz]].<br />
<br />
= Внешний вид графа =<br />
«Dot» позволяет изменять внешний вид графа. Например, можно изменять форму фигур (прямоугольники, овалы, круги, параллелограммы, многоугольники), цвет и шрифт текста, цвет фона фигур, стиль стрелок и рамок фигур, подписи стрелок и т. д.<br />
Итак, основные объектами являются узлы («node») и ребра («edge»). Для того, чтобы настроить свойства всех узлов или ребер нужно вначале использовать команды<br />
node[свойство1="значение1",свойство2="значение2",...]<br />
edge[свойство1="значение1",свойство2="значение2",...]<br />
Также (в квадратных скобках после описания объекта) можно изменять настройки конкретного узла или ребра. Параметры графа, просто задаются в виде <tt>параметр=значение</tt>.<br />
Полезно запомнить параметр «rankdir», он может быть «TB» (top->bottom, параметр по умолчанию), или «LR» (left->right), и определяет, сверху-вниз, или справа-налево, нужно располагать узлы графа. Вот пестрый пример:<br />
<br />
digraph G{<br />
rankdir=LR;<br />
node[color="red",fontsize=14];<br />
edge[color="darkgreen",fontcolor="blue",fontsize=12];<br />
OPEN[shape="rectangle",style="filled",fillcolor="lightgrey"];<br />
CLOSED[shape="octagon",label="Финиш"];<br />
VERIFIED[shape="rectangle",style="rounded"];<br />
OPEN->RESOLVED->VERIFIED->CLOSED;<br />
OPEN->CLOSED[style="bold"];<br />
VERIFIED->OPEN[label="обнаружены ошибки",style="dashed",arrowhead="dot"];<br />
}<br />
<br />
на выходе будет<br />
<br />
<graph><br />
digraph G{<br />
rankdir=LR;<br />
node[color="red",fontsize=14];<br />
edge[color="darkgreen",fontcolor="blue",fontsize=12];<br />
OPEN[shape="rectangle",style="filled",fillcolor="lightgrey"];<br />
CLOSED[shape="octagon",label="Финиш"];<br />
VERIFIED[shape="rectangle",style="rounded"];<br />
OPEN->RESOLVED->VERIFIED->CLOSED;<br />
OPEN->CLOSED[style="bold"];<br />
VERIFIED->OPEN[label="обнаружены ошибки",style="dashed",arrowhead="dot"];<br />
}<br />
</graph><br />
<br />
Если предполагается, что граф будут не только просматривать через IE, но и печатать, то необходимо установить ширину картинки, иначе при печати картинка будет обрезана. Для этого следует задать внутри описания <br />
size="6.7,15";<br />
Существенна только первая цифра. Число 6.7 подобрано эмпирически, оно обеспечивает печать полной картинки при настройках IE по умолчанию.<br />
<br />
= Уровни в графах = <br />
<br />
В «Dot» присутствует возможность связать узлы графа не только стрелками, но и уровнями отображения, что позволяет создавать шкалу и располагать узлы графа соответственно данной шкале. Для связывания используется следующая конструкция:<br />
{ rank = same; "элемент уровня"; "элемент для привязки 1"; "элемент для привязки 2"; ..}<br />
<br />
<br />
Например, при использовании следующей конструкции: <br />
<nowiki><graph><br />
digraph G{<br />
node[fontsize=9];<br />
{ /* шкала месяцев*/<br />
node[shape=plaintext]; /* что бы не было видно рамок */<br />
edge[color=white] /* что бы не было видно стрелок */<br />
"март" -> "июнь" -> "сентябрь" -> "декабрь"; <br />
}<br />
{ rank = same; "март"; "весна"; "a"; }<br />
{ rank = same; "июнь"; "лето";}<br />
{ rank = same; "сентябрь"; "осень"; "d"; }<br />
{ rank = same; "декабрь"; "зима"; "e"}<br />
"весна" -> "лето" -> "осень" -> "зима" -> "весна"<br />
"a" -> "b" -> "c" -> "d" -> "e" ;<br />
}<br />
</graph></nowiki><br />
<br />
на выходе получается:<br />
<graph><br />
digraph G{<br />
node[fontsize=9];<br />
{ /* шкала месяцев*/<br />
node[shape=plaintext]; /* что бы не было видно рамок */<br />
edge[color=white] /* что бы не было видно стрелок */<br />
"март" -> "июнь" -> "сентябрь" -> "декабрь"; <br />
}<br />
{ rank = same; "март"; "весна"; "a"; }<br />
{ rank = same; "июнь"; "лето";}<br />
{ rank = same; "сентябрь"; "осень"; "d"; }<br />
{ rank = same; "декабрь"; "зима"; "e"}<br />
"весна" -> "лето" -> "осень" -> "зима" -> "весна"<br />
"a" -> "b" -> "c" -> "d" -> "e" ;<br />
}<br />
</graph><br />
<br />
= Многосекционный узлы =<br />
<br />
Dot позволяет создавать многосекционные узлы при это каждая секция может быть поименована, и тогда ребра можно продоводить между секциями и узлами.<br />
<br />
Для включения режима многосекционности устанавливается атрибут узла shape.<br />
shape=record;<br />
<br />
Секции описываются в атрибуте label узла, с помощью разделителя «|». Для именования секции ее имя указывается в <>. При описание ребра, исходящего или входящего в секцию, секция именуется следующим образом:<br />
<br />
элемент:<имя_секции><br />
<br />
Например, из такого описания:<br />
<br />
digraph structs {<br />
rankdir=HR;<br />
first [shape=record,label=" x1\n all | { x21 | <f0> x22| x23} | x3" ];<br />
second [shape=record,label=" x22_1 | x22_2 | x22_3"];<br />
first:<f0> -> second;<br />
}<br />
<br />
Получается следующее:<br />
<br />
<graph><br />
digraph structs {<br />
rankdir=HR;<br />
first [shape=record,label=" x1\n all | { x21 | <f0> x22| x23} | x3" ];<br />
second [shape=record,label=" x22_1 | x22_2 | x22_3"];<br />
first:<f0> -> second;<br />
}<br />
</graph><br />
<br />
= Гиперссылки на графах =<br />
<br />
Можно использовать атрибут «URL», задавая относительные или абсолютные гиперссылки для узлов и ребер. Например<br />
<br />
<nowiki><graph><br />
digraph G {<br />
rankdir=LR;<br />
SGML [URL="SGML"];<br />
HTML [URL="HTML"];<br />
XML [URL="XML"];<br />
XHTML [URL="http://www.w3schools.com/xhtml/"];<br />
SGML->HTML;<br />
SGML->XML;<br />
HTML->XHTML;<br />
XML->XHTML;<br />
SGML->XHTML[color="red",fontcolor="blue",label="ссылка на Google",URL="http://www.google.com"];<br />
}<br />
</graph></nowiki><br />
<br />
<br />
<graph><br />
digraph G {<br />
rankdir=LR;<br />
SGML [URL="SGML"];<br />
HTML [URL="HTML"];<br />
XML [URL="XML"];<br />
XHTML [URL="http://www.w3schools.com/xhtml/"];<br />
SGML->HTML;<br />
SGML->XML;<br />
HTML->XHTML;<br />
XML->XHTML;<br />
SGML->XHTML[color="red",fontcolor="blue",label="ссылка на Google",URL="http://www.google.com"];<br />
}<br />
</graph><br />
<br />
= Кластеры в графах = <br />
<br />
Программа «Dot» позволяет объединять узлы графов в кластеры для подчеркивания общности. <br />
<br />
Кластер описывается следующим синтаксисом:<br />
subgraph имя{<br />
свойство1 = "значение1",свойство2="значение2",...<br />
узел1; <br />
узел2;<br />
...<br />
}<br />
При этом ''имя'' подграфа должно начинаться с префикса '''cluster''', иначе подграф не позволяет себя отобразить на экран(раскраска, контур, подпись, .. ).<br />
<br />
Например:<br />
<br />
digraph G {<br />
rankdir=LR;<br />
subgraph cluster0 {<br />
node [style=filled,color=white];<br />
style=filled;<br />
color=lightgrey;<br />
a0;<br />
a1<br />
label = "process #1";<br />
}<br />
subgraph cluster1 {<br />
node [style=filled];<br />
b0;<br />
label = "process #2";<br />
color=blue<br />
}<br />
start -> a0;<br />
start -> b0;<br />
a0 -> a1 -> end;<br />
b0 -> end;<br />
}<br />
<br />
<graph><br />
digraph G {<br />
rankdir=LR;<br />
subgraph cluster0 {<br />
node [style=filled,color=white];<br />
style=filled;<br />
color=lightgrey;<br />
a0;<br />
a1<br />
label = "process #1";<br />
}<br />
subgraph cluster1 {<br />
node [style=filled];<br />
b0;<br />
label = "process #2";<br />
color=blue<br />
}<br />
start -> a0;<br />
start -> b0;<br />
a0 -> a1 -> end;<br />
b0 -> end;<br />
}<br />
</graph><br />
<br />
= Цвета и черно-белая печать=<br />
Graphviz позволяет использовать широкую цветовую палитру, однако, стоит не забывать, что контрастно выглядящие на цветном мониторе цвета, могут быть совершенно неразличимы после черно-белой печати. После проделанных экспериментов ({{Bug|11015}}), можно рекомендовать следующие палитры цветов (иллюстрированы на цвете ребер графа):<br />
<br />
<graph-print><br />
digraph G{ rankdir=TB; size="7,6";<br />
<br />
Палитра1->goldenrod1 [color=goldenrod1]<br />
Палитра1->green [color=green]<br />
Палитра1->sienna4 [color=sienna4]<br />
Палитра1->red1 [color=red1]<br />
Палитра1->blue2 [color=blue2]<br />
<br />
Палитра2->lightcyan2 [color=lightcyan2]<br />
Палитра2->pink2 [color=pink2]<br />
Палитра2->green [color=green]<br />
Палитра2->sienna4 [color=sienna4]<br />
Палитра2->red2 [color=red2]<br />
Палитра2->black1 [color=black1]<br />
}<br />
</graph-print><br />
<br />
= Формы вершин =<br />
<br />
Перечислим палитру возможных форм вершин (узлов).<br />
<br />
<neato><br />
digraph G{ <br />
edge [arrowtail="none"]<br />
node [style=filled, colorscheme="brbg9"]; <br />
<br />
"box" [shape="box" fillcolor="1"];<br />
"polygon" [shape="polygon" fillcolor="2"];<br />
"ellipse" [shape="ellipse" fillcolor="3"];<br />
"circle" [shape="circle" fillcolor="4"];<br />
"point" [shape="point" fillcolor="black"];<br />
"egg" [shape="egg" fillcolor="6"];<br />
"triangle" [shape="triangle" fillcolor="7"];<br />
"plaintext" [shape="plaintext" fillcolor="8"];<br />
"diamond" [shape="diamond" fillcolor="9"];<br />
"trapezium" [shape="trapezium" fillcolor="1"];<br />
"parallelogram" [shape="parallelogram" fillcolor="2"];<br />
"house" [shape="house" fillcolor="3"];<br />
"pentagon" [shape="pentagon" fillcolor="4"];<br />
"hexagon" [shape="hexagon" fillcolor="5"];<br />
"septagon" [shape="septagon" fillcolor="6"];<br />
"octagon" [shape="octagon" fillcolor="7"];<br />
"doublecircle" [shape="doublecircle" fillcolor="8"];<br />
"doubleoctagon" [shape="doubleoctagon" fillcolor="9"];<br />
"tripleoctagon" [shape="tripleoctagon" fillcolor="1"];<br />
"invtriangle" [shape="invtriangle" fillcolor="1"];<br />
"invtrapezium" [shape="invtrapezium" fillcolor="2"];<br />
"invhouse" [shape="invhouse" fillcolor="3"];<br />
"Mdiamond" [shape="Mdiamond" fillcolor="4"];<br />
"Msquare" [shape="Msquare" fillcolor="5"];<br />
"Mcircle" [shape="Mcircle" fillcolor="6"];<br />
"rect/rectangle" [shape="rect" fillcolor="7"];<br />
"none" [shape="none" fillcolor="8"];<br />
"note" [shape="note" fillcolor="9"];<br />
"tab" [shape="tab" fillcolor="1"];<br />
"folder" [shape="folder" fillcolor="2"];<br />
"box3d" [shape="box3d" fillcolor="3"];<br />
"component" [shape="component" fillcolor="4"];<br />
}<br />
</neato><br />
<br />
= Окончания ребер =<br />
Можно задавать стиль офомления начала («arrowtail») и конца («arrowhead») дуг (ребер):<br />
<br />
<circo><br />
digraph G{ <br />
<br />
edge [arrowtail="none"]<br />
A [label="Arrowhead" style=filled fillcolor="yellow"];<br />
<br />
A->"normal" [arrowhead="normal"];<br />
A->"dot" [arrowhead="dot"];<br />
A->"odot" [arrowhead="odot"];<br />
A->"none" [arrowhead="none"];<br />
A->"empty" [arrowhead="empty"];<br />
A->"diamond" [arrowhead="diamond"];<br />
A->"ediamond" [arrowhead="ediamond"];<br />
A->"box" [arrowhead="box"];<br />
A->"open" [arrowhead="open"];<br />
A->"vee" [arrowhead="vee"];<br />
A->"inv" [arrowhead="inv"];<br />
A->"invdot" [arrowhead="invdot"];<br />
A->"invodot" [arrowhead="invodot"];<br />
A->"tee" [arrowhead="tee"];<br />
A->"invempty" [arrowhead="invempty"];<br />
A->"odiamond" [arrowhead="odiamond"];<br />
A->"crow" [arrowhead="crow"];<br />
A->"obox" [arrowhead="obox"];<br />
A->"halfopen" [arrowhead="halfopen"];<br />
}<br />
</circo><br />
<br />
= Неориентированные графы =<br />
Наряду с рисованием ориентированных графов, есть несколько методов для автоматического рисования неориентированных графов (будем рассматривать их на примере несложной ER-диаграммы).<br />
<br />
В отличие от автоматического рисования направленных («directed») графов, основанных на ранговой модели, есть несколько подходов к раскладке ненаправленных графов.<br />
<br />
== Graph ==<br />
Ненаправленный граф можно нарисовать с помощью рангового подхода (несмотря на ненаправленность ребер) — будет использоваться программа «dot». Как это будет выглядеть для простой ER-диаграммы, можно увидеть ниже.<br />
<graph><br />
graph ER<br />
{<br />
node [fontsize=12];<br />
node [shape=box]; course; institute; student;<br />
node [shape=ellipse];<br />
{node [label="name"] name0; name1; name2;}<br />
code; grade; number;<br />
node [shape=diamond,style=filled,color=lightgrey];<br />
"C-I"; "S-C"; "S-I";<br />
name0 -- course;<br />
code -- course;<br />
course -- "C-I" [label="n",len=1.00];<br />
"C-I" -- institute [label="1",len=1.00];<br />
institute -- name1;<br />
institute -- "S-I" [label="1",len=1.00];<br />
"S-I" -- student [label="n",len=1.00];<br />
student -- grade;<br />
student -- name2;<br />
student -- number;<br />
student -- "S-C" [label="m",len=1.00];<br />
"S-C" -- course [label="n",len=1.00];<br />
label = "\n\nEntity Relation Diagram\ndrawn by DOT";<br />
}<br />
</graph><br />
<br />
Очевидна неоптимальность такого подхода для неориентированных графов.<br />
<br />
== Neato ==<br />
<br />
Метод «neato» использует «энергетическую» (''spring'') модель, по сути, близкую к методу искуственного отжига — начиная с некоторого состояния вершины перемещаются, чтобы минимизировать некую потенциальную энергию. Рекомендуем для ненаправленных графов общего вида.<br />
<br />
<neato><br />
graph ER<br />
{<br />
node [fontsize=12];<br />
node [shape=box]; course; institute; student;<br />
node [shape=ellipse];<br />
{node [label="name"] name0; name1; name2;}<br />
code; grade; number;<br />
node [shape=diamond,style=filled,color=lightgrey];<br />
"C-I"; "S-C"; "S-I";<br />
name0 -- course;<br />
code -- course;<br />
course -- "C-I" [label="n",len=1.00];<br />
"C-I" -- institute [label="1",len=1.00];<br />
institute -- name1;<br />
institute -- "S-I" [label="1",len=1.00];<br />
"S-I" -- student [label="n",len=1.00];<br />
student -- grade;<br />
student -- name2;<br />
student -- number;<br />
student -- "S-C" [label="m",len=1.00];<br />
"S-C" -- course [label="n",len=1.00];<br />
label = "\n\nEntity Relation Diagram\ndrawn by NEATO";<br />
}<br />
</neato><br />
<br />
== FDP ==<br />
Метод «fdp» по сути, близок к методу «neato», и использует другую разновидность «энергетического» («spring») подхода. Также рекомендуется для ненаправленных графов общего типа.<br />
<br />
<fdp><br />
graph ER<br />
{<br />
node [fontsize=12];<br />
node [shape=box]; course; institute; student;<br />
node [shape=ellipse];<br />
{node [label="name"] name0; name1; name2;}<br />
code; grade; number;<br />
node [shape=diamond,style=filled,color=lightgrey];<br />
"C-I"; "S-C"; "S-I";<br />
name0 -- course;<br />
code -- course;<br />
course -- "C-I" [label="n",len=1.00];<br />
"C-I" -- institute [label="1",len=1.00];<br />
institute -- name1;<br />
institute -- "S-I" [label="1",len=1.00];<br />
"S-I" -- student [label="n",len=1.00];<br />
student -- grade;<br />
student -- name2;<br />
student -- number;<br />
student -- "S-C" [label="m",len=1.00];<br />
"S-C" -- course [label="n",len=1.00];<br />
label = "\n\nEntity Relation Diagram\ndrawn by FDP";<br />
}<br />
</fdp><br />
<br />
<br />
<br />
<br />
== Twopi ==<br />
<br />
Метод «twopi» рисует графы с радиальной раскладкой. По сути одна вершина выбирается центральной, и помещается в центр, а остальные размещаются на последовательности концентрических орбит, вокруг этой вершины. Т.е. все вершины на расстоянии в «одно ребро» от центра, лежат на первой орбите, «в два ребра» — на второй и т. д.<br />
<br />
<twopi><br />
graph ER<br />
{<br />
<br />
node [fontsize=12];<br />
node [shape=box]; course; institute; student;<br />
node [shape=ellipse];<br />
{node [label="name"] name0; name1; name2;}<br />
code; grade; number;<br />
node [shape=diamond,style=filled,color=lightgrey];<br />
"C-I"; "S-C"; "S-I";<br />
name0 -- course;<br />
code -- course;<br />
course -- "C-I" [label="n",len=1.00];<br />
"C-I" -- institute [label="1",len=1.00];<br />
institute -- name1;<br />
institute -- "S-I" [label="1",len=1.00];<br />
"S-I" -- student [label="n",len=1.00];<br />
student -- grade;<br />
student -- name2;<br />
student -- number;<br />
student -- "S-C" [label="m",len=1.00];<br />
"S-C" -- course [label="n",len=1.00];<br />
label = "\n\nEntity Relation Diagram\ndrawn by TWOPI";<br />
}<br />
</twopi><br />
<br />
== CIRCO ==<br />
<br />
Метод «circo» использует «circular layout». Выделяются двусвязные компоненты (каждая вершина имеет по крайней мере два ребра) и вершины этих компонент рисуются на некотором круге. «Дополнительные» ребра рисуются радиально и далее процесс повторяется. Пересечение ребер внутри круга минимизируется максимально возможным выносом ребер с круга за его периметр. <br />
<br />
<circo><br />
graph ER<br />
{<br />
node [fontsize=12];<br />
node [shape=box]; course; institute; student;<br />
node [shape=ellipse];<br />
{node [label="name"] name0; name1; name2;}<br />
code; grade; number;<br />
node [shape=diamond,style=filled,color=lightgrey];<br />
"C-I"; "S-C"; "S-I";<br />
name0 -- course;<br />
code -- course;<br />
course -- "C-I" [label="n",len=1.00];<br />
"C-I" -- institute [label="1",len=1.00];<br />
institute -- name1;<br />
institute -- "S-I" [label="1",len=1.00];<br />
"S-I" -- student [label="n",len=1.00];<br />
student -- grade;<br />
student -- name2;<br />
student -- number;<br />
student -- "S-C" [label="m",len=1.00];<br />
"S-C" -- course [label="n",len=1.00];<br />
label = "\n\nEntity Relation Diagram\ndrawn by CIRCO";<br />
}<br />
</circo><br />
<br />
= Версии для печати =<br />
Как известно, трудно добиться хорошего результата одновременно на экране и на принтере, в силу разных разрешений. Картинка экранного разрешения будет плохо (с «зазубринами») выглядеть на принтере, а картинка печатного разрешения, будет очень плохо выглядеть на экране (к сожалению, современные броузеры выполняют очень примитивный ресайзинг картинок при показе), и будет достаточно много «весить». Все соображения о печатных картинках также относятся к случаю, когда вы переносите (например, копируя вебстраницу из броузера через клипборд) содержимое MediaWiki-статьи в MS Word или другой текстовый редактор.<br />
Для такого, «печатного» случая (т. е. если у вас не примитивные графы, и вы собираетесь их печатать или переносить в другую систему верстки), мы сделали «печатную версию» всех перечисленных графов, с разрешением около 200 DPI. Для этого надо использовать те же самые тэги с постфиксом «-print», например «graph-print»,«neato-print», и т.п.:<br />
<br />
<graph-print><br />
digraph G{<br />
rankdir=LR;<br />
node[color="red",fontsize=14];<br />
edge[color="darkgreen",fontcolor="blue",fontsize=12];<br />
OPEN[shape="rectangle",style="filled",fillcolor="lightgrey"];<br />
CLOSED[shape="octagon",label="Финиш"];<br />
VERIFIED[shape="rectangle",style="rounded"];<br />
OPEN->RESOLVED->VERIFIED->CLOSED;<br />
OPEN->CLOSED[style="bold"];<br />
VERIFIED->OPEN[label="обнаружены ошибки",style="dashed",arrowhead="dot"];<br />
}<br />
</graph-print><br />
<br />
Полученные картинки являются компромиссом, между весом, читаемостью на экране и читаемостью на бумаге.<br />
Желательно не использовать для совершенно тривиальных графов, или графов, которых вы не собираетесь печатать.<br />
<br />
= Установка GraphViz =<br />
== Установка на MoWeS Portable ==<br />
<br />
[[MoWeS Portable]] - портативный вебсервер включающий [[PHP5]] и [[MySQL]] позволяющий установить [[MediaWiki]] 1.5.1 на локальный компьютер или USB флэшь-диск.<br />
<br />
<br />
=== Ссылки по MoWeS и GraphViz ===<br />
<br />
* [http://www.mediawiki.org/wiki/Manual:Installing_on_MoWeS_Portable_%28Windows%29 Описание MoWeS]<br />
* [http://www.chsoftware.net/en/useware/mowes/mowes.htm Сайт разработчиков MoWeS]<br />
<br />
* [http://www.mediawiki.org/wiki/Extension:GraphViz описание расширения GraphViz для МедиаВики]<br />
* [http://www.mediawiki.org/wiki/Extension:MscGen расширение MSGGen (блок-схемы)для МедиаВики]<br />
* [http://www.mediawiki.org/wiki/Extension:GraphVizAndMSCGen расширения GraphViz и MSGGen для МедиаВики]<br />
* [http://www.wikischool.de/wiki/WikiSchool:Graphviz немецкий сайт по Graphviz]<br />
<br />
= Ссылки и дополнительная документация =<br />
<br />
Онлайн-документация, +последние изменения, FAQ и прочее можно найти на домашней странице пакета<br />
http://www.graphviz.org/Documentation.php<br />
<br />
<br />
<br />
[[Category:Документирование]]<br />
{{replicate-from-custiswiki-to-lib}}<br />
{{replicate-from-custiswiki-to-all}}</div>
Картограф
http://lib.custis.ru/index.php?title=Graphviz&diff=11158
Graphviz
2009-09-01T06:45:56Z
<p>Картограф: </p>
<hr />
<div>'''Graphviz''' — это разработанный специалистами лаборатории AT&T пакет утилит по автоматической визуализации графов, заданных в виде текстового описания. Пакет распространяется с открытыми исходными файлами и работает на всех операционных системах, включая Windows, Linux/Unix, Mac OS. Самой интересной программой пакета является «dot», автоматический визуализатор направленных графов, который принимает на вход текстовый файл со структурой графа, а на выходе формирует граф в виде графического, векторного или текстового файла.<br />
<br />
= Быстрый старт =<br />
<br />
Входной файл для программы «DOT» является обычным текстовым файлом на специальном языке разметки графа. Структура файла очень простая, например,<br />
<br />
digraph G{ <br />
Рождение->Юность->Зрелость->Старость->Смерть;<br />
Юность->Смерть;<br />
Зрелость->Смерть;<br />
}<br />
<br />
на выходе будет<br />
<br />
<graph> <br />
digraph G{<br />
Рождение->Юность->Зрелость->Старость->Смерть;<br />
Юность->Смерть;<br />
Зрелость->Смерть;<br />
}<br />
</graph><br />
<br />
Программа «Dot» сама распознает все связи графа и упорядочит его таким образом, чтобы было наименьшее количество пересечений.<br />
<br />
Чтобы использовать «dot»-графы в [[{{SITENAME}}]], используйте следующий синтаксис:<br />
<br />
<nowiki><graph><br />
digraph G{ <br />
Рождение->Юность->Зрелость->Старость->Смерть;<br />
Юность->Смерть;<br />
Зрелость->Смерть;<br />
}<br />
</graph></nowiki><br />
<br />
Если у вас узлы поименованы словосочетаниями, заключите их в кавычки, т. е.<br />
<br />
<nowiki><graph><br />
digraph G{<br />
"Полет фантазии"->"Расход горючего";<br />
}<br />
</graph></nowiki><br />
<br />
Поздравляем! Теперь вы способны рисовать графы в [[{{SITENAME}}]]. Остальной текст будет посвящен некоторым тонкостям использования [[Graphviz]].<br />
<br />
= Внешний вид графа =<br />
«Dot» позволяет изменять внешний вид графа. Например, можно изменять форму фигур (прямоугольники, овалы, круги, параллелограммы, многоугольники), цвет и шрифт текста, цвет фона фигур, стиль стрелок и рамок фигур, подписи стрелок и т. д.<br />
Итак, основные объектами являются узлы («node») и ребра («edge»). Для того, чтобы настроить свойства всех узлов или ребер нужно вначале использовать команды<br />
node[свойство1="значение1",свойство2="значение2",...]<br />
edge[свойство1="значение1",свойство2="значение2",...]<br />
Также (в квадратных скобках после описания объекта) можно изменять настройки конкретного узла или ребра. Параметры графа, просто задаются в виде <tt>параметр=значение</tt>.<br />
Полезно запомнить параметр «rankdir», он может быть «TB» (top->bottom, параметр по умолчанию), или «LR» (left->right), и определяет, сверху-вниз, или справа-налево, нужно располагать узлы графа. Вот пестрый пример:<br />
<br />
digraph G{<br />
rankdir=LR;<br />
node[color="red",fontsize=14];<br />
edge[color="darkgreen",fontcolor="blue",fontsize=12];<br />
OPEN[shape="rectangle",style="filled",fillcolor="lightgrey"];<br />
CLOSED[shape="octagon",label="Финиш"];<br />
VERIFIED[shape="rectangle",style="rounded"];<br />
OPEN->RESOLVED->VERIFIED->CLOSED;<br />
OPEN->CLOSED[style="bold"];<br />
VERIFIED->OPEN[label="обнаружены ошибки",style="dashed",arrowhead="dot"];<br />
}<br />
<br />
на выходе будет<br />
<br />
<graph><br />
digraph G{<br />
rankdir=LR;<br />
node[color="red",fontsize=14];<br />
edge[color="darkgreen",fontcolor="blue",fontsize=12];<br />
OPEN[shape="rectangle",style="filled",fillcolor="lightgrey"];<br />
CLOSED[shape="octagon",label="Финиш"];<br />
VERIFIED[shape="rectangle",style="rounded"];<br />
OPEN->RESOLVED->VERIFIED->CLOSED;<br />
OPEN->CLOSED[style="bold"];<br />
VERIFIED->OPEN[label="обнаружены ошибки",style="dashed",arrowhead="dot"];<br />
}<br />
</graph><br />
<br />
Если предполагается, что граф будут не только просматривать через IE, но и печатать, то необходимо установить ширину картинки, иначе при печати картинка будет обрезана. Для этого следует задать внутри описания <br />
size="6.7,15";<br />
Существенна только первая цифра. Число 6.7 подобрано эмпирически, оно обеспечивает печать полной картинки при настройках IE по умолчанию.<br />
<br />
= Уровни в графах = <br />
<br />
В «Dot» присутствует возможность связать узлы графа не только стрелками, но и уровнями отображения, что позволяет создавать шкалу и располагать узлы графа соответственно данной шкале. Для связывания используется следующая конструкция:<br />
{ rank = same; "элемент уровня"; "элемент для привязки 1"; "элемент для привязки 2"; ..}<br />
<br />
<br />
Например, при использовании следующей конструкции: <br />
<nowiki><graph><br />
digraph G{<br />
node[fontsize=9];<br />
{ /* шкала месяцев*/<br />
node[shape=plaintext]; /* что бы не было видно рамок */<br />
edge[color=white] /* что бы не было видно стрелок */<br />
"март" -> "июнь" -> "сентябрь" -> "декабрь"; <br />
}<br />
{ rank = same; "март"; "весна"; "a"; }<br />
{ rank = same; "июнь"; "лето";}<br />
{ rank = same; "сентябрь"; "осень"; "d"; }<br />
{ rank = same; "декабрь"; "зима"; "e"}<br />
"весна" -> "лето" -> "осень" -> "зима" -> "весна"<br />
"a" -> "b" -> "c" -> "d" -> "e" ;<br />
}<br />
</graph></nowiki><br />
<br />
на выходе получается:<br />
<graph><br />
digraph G{<br />
node[fontsize=9];<br />
{ /* шкала месяцев*/<br />
node[shape=plaintext]; /* что бы не было видно рамок */<br />
edge[color=white] /* что бы не было видно стрелок */<br />
"март" -> "июнь" -> "сентябрь" -> "декабрь"; <br />
}<br />
{ rank = same; "март"; "весна"; "a"; }<br />
{ rank = same; "июнь"; "лето";}<br />
{ rank = same; "сентябрь"; "осень"; "d"; }<br />
{ rank = same; "декабрь"; "зима"; "e"}<br />
"весна" -> "лето" -> "осень" -> "зима" -> "весна"<br />
"a" -> "b" -> "c" -> "d" -> "e" ;<br />
}<br />
</graph><br />
<br />
= Многосекционный узлы =<br />
<br />
Dot позволяет создавать многосекционные узлы при это каждая секция может быть поименована, и тогда ребра можно продоводить между секциями и узлами.<br />
<br />
Для включения режима многосекционности устанавливается атрибут узла shape.<br />
shape=record;<br />
<br />
Секции описываются в атрибуте label узла, с помощью разделителя «|». Для именования секции ее имя указывается в <>. При описание ребра, исходящего или входящего в секцию, секция именуется следующим образом:<br />
<br />
элемент:<имя_секции><br />
<br />
Например, из такого описания:<br />
<br />
digraph structs {<br />
rankdir=HR;<br />
first [shape=record,label=" x1\n all | { x21 | <f0> x22| x23} | x3" ];<br />
second [shape=record,label=" x22_1 | x22_2 | x22_3"];<br />
first:<f0> -> second;<br />
}<br />
<br />
Получается следующее:<br />
<br />
<graph><br />
digraph structs {<br />
rankdir=HR;<br />
first [shape=record,label=" x1\n all | { x21 | <f0> x22| x23} | x3" ];<br />
second [shape=record,label=" x22_1 | x22_2 | x22_3"];<br />
first:<f0> -> second;<br />
}<br />
</graph><br />
<br />
= Гиперссылки на графах =<br />
<br />
Можно использовать атрибут «URL», задавая относительные или абсолютные гиперссылки для узлов и ребер. Например<br />
<br />
<nowiki><graph><br />
digraph G {<br />
rankdir=LR;<br />
SGML [URL="SGML"];<br />
HTML [URL="HTML"];<br />
XML [URL="XML"];<br />
XHTML [URL="http://www.w3schools.com/xhtml/"];<br />
SGML->HTML;<br />
SGML->XML;<br />
HTML->XHTML;<br />
XML->XHTML;<br />
SGML->XHTML[color="red",fontcolor="blue",label="ссылка на Google",URL="http://www.google.com"];<br />
}<br />
</graph></nowiki><br />
<br />
<br />
<graph><br />
digraph G {<br />
rankdir=LR;<br />
SGML [URL="SGML"];<br />
HTML [URL="HTML"];<br />
XML [URL="XML"];<br />
XHTML [URL="http://www.w3schools.com/xhtml/"];<br />
SGML->HTML;<br />
SGML->XML;<br />
HTML->XHTML;<br />
XML->XHTML;<br />
SGML->XHTML[color="red",fontcolor="blue",label="ссылка на Google",URL="http://www.google.com"];<br />
}<br />
</graph><br />
<br />
= Кластеры в графах = <br />
<br />
Программа «Dot» позволяет объединять узлы графов в кластеры для подчеркивания общности. <br />
<br />
Кластер описывается следующим синтаксисом:<br />
subgraph имя{<br />
свойство1 = "значение1",свойство2="значение2",...<br />
узел1; <br />
узел2;<br />
...<br />
}<br />
При этом ''имя'' подграфа должно начинаться с префикса '''cluster''', иначе подграф не позволяет себя отобразить на экран(раскраска, контур, подпись, .. ).<br />
<br />
Например:<br />
<br />
digraph G {<br />
rankdir=LR;<br />
subgraph cluster0 {<br />
node [style=filled,color=white];<br />
style=filled;<br />
color=lightgrey;<br />
a0;<br />
a1<br />
label = "process #1";<br />
}<br />
subgraph cluster1 {<br />
node [style=filled];<br />
b0;<br />
label = "process #2";<br />
color=blue<br />
}<br />
start -> a0;<br />
start -> b0;<br />
a0 -> a1 -> end;<br />
b0 -> end;<br />
}<br />
<br />
<graph><br />
digraph G {<br />
rankdir=LR;<br />
subgraph cluster0 {<br />
node [style=filled,color=white];<br />
style=filled;<br />
color=lightgrey;<br />
a0;<br />
a1<br />
label = "process #1";<br />
}<br />
subgraph cluster1 {<br />
node [style=filled];<br />
b0;<br />
label = "process #2";<br />
color=blue<br />
}<br />
start -> a0;<br />
start -> b0;<br />
a0 -> a1 -> end;<br />
b0 -> end;<br />
}<br />
</graph><br />
<br />
= Цвета и черно-белая печать=<br />
Graphviz позволяет использовать широкую цветовую палитру, однако, стоит не забывать, что контрастно выглядящие на цветном мониторе цвета, могут быть совершенно неразличимы после черно-белой печати. После проделанных экспериментов ({{Bug|11015}}), можно рекомендовать следующие палитры цветов (иллюстрированы на цвете ребер графа):<br />
<br />
<graph-print><br />
digraph G{ rankdir=TB; size="7,6";<br />
<br />
Палитра1->goldenrod1 [color=goldenrod1]<br />
Палитра1->green [color=green]<br />
Палитра1->sienna4 [color=sienna4]<br />
Палитра1->red1 [color=red1]<br />
Палитра1->blue2 [color=blue2]<br />
<br />
Палитра2->lightcyan2 [color=lightcyan2]<br />
Палитра2->pink2 [color=pink2]<br />
Палитра2->green [color=green]<br />
Палитра2->sienna4 [color=sienna4]<br />
Палитра2->red2 [color=red2]<br />
Палитра2->black1 [color=black1]<br />
}<br />
</graph-print><br />
<br />
= Формы вершин =<br />
<br />
Перечислим палитру возможных форм вершин (узлов).<br />
<br />
<neato><br />
digraph G{ <br />
edge [arrowtail="none"]<br />
node [style=filled, colorscheme="brbg9"]; <br />
<br />
"box" [shape="box" fillcolor="1"];<br />
"polygon" [shape="polygon" fillcolor="2"];<br />
"ellipse" [shape="ellipse" fillcolor="3"];<br />
"circle" [shape="circle" fillcolor="4"];<br />
"point" [shape="point" fillcolor="black"];<br />
"egg" [shape="egg" fillcolor="6"];<br />
"triangle" [shape="triangle" fillcolor="7"];<br />
"plaintext" [shape="plaintext" fillcolor="8"];<br />
"diamond" [shape="diamond" fillcolor="9"];<br />
"trapezium" [shape="trapezium" fillcolor="1"];<br />
"parallelogram" [shape="parallelogram" fillcolor="2"];<br />
"house" [shape="house" fillcolor="3"];<br />
"pentagon" [shape="pentagon" fillcolor="4"];<br />
"hexagon" [shape="hexagon" fillcolor="5"];<br />
"septagon" [shape="septagon" fillcolor="6"];<br />
"octagon" [shape="octagon" fillcolor="7"];<br />
"doublecircle" [shape="doublecircle" fillcolor="8"];<br />
"doubleoctagon" [shape="doubleoctagon" fillcolor="9"];<br />
"tripleoctagon" [shape="tripleoctagon" fillcolor="1"];<br />
"invtriangle" [shape="invtriangle" fillcolor="1"];<br />
"invtrapezium" [shape="invtrapezium" fillcolor="2"];<br />
"invhouse" [shape="invhouse" fillcolor="3"];<br />
"Mdiamond" [shape="Mdiamond" fillcolor="4"];<br />
"Msquare" [shape="Msquare" fillcolor="5"];<br />
"Mcircle" [shape="Mcircle" fillcolor="6"];<br />
"rect/rectangle" [shape="rect" fillcolor="7"];<br />
"none" [shape="none" fillcolor="8"];<br />
"note" [shape="note" fillcolor="9"];<br />
"tab" [shape="tab" fillcolor="1"];<br />
"folder" [shape="folder" fillcolor="2"];<br />
"box3d" [shape="box3d" fillcolor="3"];<br />
"component" [shape="component" fillcolor="4"];<br />
}<br />
</neato><br />
<br />
= Окончания ребер =<br />
Можно задавать стиль офомления начала («arrowtail») и конца («arrowhead») дуг (ребер):<br />
<br />
<circo><br />
digraph G{ <br />
<br />
edge [arrowtail="none"]<br />
A [label="Arrowhead" style=filled fillcolor="yellow"];<br />
<br />
A->"normal" [arrowhead="normal"];<br />
A->"dot" [arrowhead="dot"];<br />
A->"odot" [arrowhead="odot"];<br />
A->"none" [arrowhead="none"];<br />
A->"empty" [arrowhead="empty"];<br />
A->"diamond" [arrowhead="diamond"];<br />
A->"ediamond" [arrowhead="ediamond"];<br />
A->"box" [arrowhead="box"];<br />
A->"open" [arrowhead="open"];<br />
A->"vee" [arrowhead="vee"];<br />
A->"inv" [arrowhead="inv"];<br />
A->"invdot" [arrowhead="invdot"];<br />
A->"invodot" [arrowhead="invodot"];<br />
A->"tee" [arrowhead="tee"];<br />
A->"invempty" [arrowhead="invempty"];<br />
A->"odiamond" [arrowhead="odiamond"];<br />
A->"crow" [arrowhead="crow"];<br />
A->"obox" [arrowhead="obox"];<br />
A->"halfopen" [arrowhead="halfopen"];<br />
}<br />
</circo><br />
<br />
= Неориентированные графы =<br />
Наряду с рисованием ориентированных графов, есть несколько методов для автоматического рисования неориентированных графов (будем рассматривать их на примере несложной ER-диаграммы).<br />
<br />
В отличие от автоматического рисования направленных («directed») графов, основанных на ранговой модели, есть несколько подходов к раскладке ненаправленных графов.<br />
<br />
== Graph ==<br />
Ненаправленный граф можно нарисовать с помощью рангового подхода (несмотря на ненаправленность ребер) — будет использоваться программа «dot». Как это будет выглядеть для простой ER-диаграммы, можно увидеть ниже.<br />
<graph><br />
graph ER<br />
{<br />
node [fontsize=12];<br />
node [shape=box]; course; institute; student;<br />
node [shape=ellipse];<br />
{node [label="name"] name0; name1; name2;}<br />
code; grade; number;<br />
node [shape=diamond,style=filled,color=lightgrey];<br />
"C-I"; "S-C"; "S-I";<br />
name0 -- course;<br />
code -- course;<br />
course -- "C-I" [label="n",len=1.00];<br />
"C-I" -- institute [label="1",len=1.00];<br />
institute -- name1;<br />
institute -- "S-I" [label="1",len=1.00];<br />
"S-I" -- student [label="n",len=1.00];<br />
student -- grade;<br />
student -- name2;<br />
student -- number;<br />
student -- "S-C" [label="m",len=1.00];<br />
"S-C" -- course [label="n",len=1.00];<br />
label = "\n\nEntity Relation Diagram\ndrawn by DOT";<br />
}<br />
</graph><br />
<br />
Очевидна неоптимальность такого подхода для неориентированных графов.<br />
<br />
== Neato ==<br />
<br />
Метод «neato» использует «энергетическую» (''spring'') модель, по сути, близкую к методу искуственного отжига — начиная с некоторого состояния вершины перемещаются, чтобы минимизировать некую потенциальную энергию. Рекомендуем для ненаправленных графов общего вида.<br />
<br />
<neato><br />
graph ER<br />
{<br />
node [fontsize=12];<br />
node [shape=box]; course; institute; student;<br />
node [shape=ellipse];<br />
{node [label="name"] name0; name1; name2;}<br />
code; grade; number;<br />
node [shape=diamond,style=filled,color=lightgrey];<br />
"C-I"; "S-C"; "S-I";<br />
name0 -- course;<br />
code -- course;<br />
course -- "C-I" [label="n",len=1.00];<br />
"C-I" -- institute [label="1",len=1.00];<br />
institute -- name1;<br />
institute -- "S-I" [label="1",len=1.00];<br />
"S-I" -- student [label="n",len=1.00];<br />
student -- grade;<br />
student -- name2;<br />
student -- number;<br />
student -- "S-C" [label="m",len=1.00];<br />
"S-C" -- course [label="n",len=1.00];<br />
label = "\n\nEntity Relation Diagram\ndrawn by NEATO";<br />
}<br />
</neato><br />
<br />
== FDP ==<br />
Метод «fdp» по сути, близок к методу «neato», и использует другую разновидность «энергетического» («spring») подхода. Также рекомендуется для ненаправленных графов общего типа.<br />
<br />
<fdp><br />
graph ER<br />
{<br />
node [fontsize=12];<br />
node [shape=box]; course; institute; student;<br />
node [shape=ellipse];<br />
{node [label="name"] name0; name1; name2;}<br />
code; grade; number;<br />
node [shape=diamond,style=filled,color=lightgrey];<br />
"C-I"; "S-C"; "S-I";<br />
name0 -- course;<br />
code -- course;<br />
course -- "C-I" [label="n",len=1.00];<br />
"C-I" -- institute [label="1",len=1.00];<br />
institute -- name1;<br />
institute -- "S-I" [label="1",len=1.00];<br />
"S-I" -- student [label="n",len=1.00];<br />
student -- grade;<br />
student -- name2;<br />
student -- number;<br />
student -- "S-C" [label="m",len=1.00];<br />
"S-C" -- course [label="n",len=1.00];<br />
label = "\n\nEntity Relation Diagram\ndrawn by FDP";<br />
}<br />
</fdp><br />
<br />
<br />
<br />
<br />
== Twopi ==<br />
<br />
Метод «twopi» рисует графы с радиальной раскладкой. По сути одна вершина выбирается центральной, и помещается в центр, а остальные размещаются на последовательности концентрических орбит, вокруг этой вершины. Т.е. все вершины на расстоянии в «одно ребро» от центра, лежат на первой орбите, «в два ребра» — на второй и т. д.<br />
<br />
<twopi><br />
graph ER<br />
{<br />
<br />
node [fontsize=12];<br />
node [shape=box]; course; institute; student;<br />
node [shape=ellipse];<br />
{node [label="name"] name0; name1; name2;}<br />
code; grade; number;<br />
node [shape=diamond,style=filled,color=lightgrey];<br />
"C-I"; "S-C"; "S-I";<br />
name0 -- course;<br />
code -- course;<br />
course -- "C-I" [label="n",len=1.00];<br />
"C-I" -- institute [label="1",len=1.00];<br />
institute -- name1;<br />
institute -- "S-I" [label="1",len=1.00];<br />
"S-I" -- student [label="n",len=1.00];<br />
student -- grade;<br />
student -- name2;<br />
student -- number;<br />
student -- "S-C" [label="m",len=1.00];<br />
"S-C" -- course [label="n",len=1.00];<br />
label = "\n\nEntity Relation Diagram\ndrawn by TWOPI";<br />
}<br />
</twopi><br />
<br />
== CIRCO ==<br />
<br />
Метод «circo» использует «circular layout». Выделяются двусвязные компоненты (каждая вершина имеет по крайней мере два ребра) и вершины этих компонент рисуются на некотором круге. «Дополнительные» ребра рисуются радиально и далее процесс повторяется. Пересечение ребер внутри круга минимизируется максимально возможным выносом ребер с круга за его периметр. <br />
<br />
<circo><br />
graph ER<br />
{<br />
node [fontsize=12];<br />
node [shape=box]; course; institute; student;<br />
node [shape=ellipse];<br />
{node [label="name"] name0; name1; name2;}<br />
code; grade; number;<br />
node [shape=diamond,style=filled,color=lightgrey];<br />
"C-I"; "S-C"; "S-I";<br />
name0 -- course;<br />
code -- course;<br />
course -- "C-I" [label="n",len=1.00];<br />
"C-I" -- institute [label="1",len=1.00];<br />
institute -- name1;<br />
institute -- "S-I" [label="1",len=1.00];<br />
"S-I" -- student [label="n",len=1.00];<br />
student -- grade;<br />
student -- name2;<br />
student -- number;<br />
student -- "S-C" [label="m",len=1.00];<br />
"S-C" -- course [label="n",len=1.00];<br />
label = "\n\nEntity Relation Diagram\ndrawn by CIRCO";<br />
}<br />
</circo><br />
<br />
= Версии для печати =<br />
Как известно, трудно добиться хорошего результата одновременно на экране и на принтере, в силу разных разрешений. Картинка экранного разрешения будет плохо (с «зазубринами») выглядеть на принтере, а картинка печатного разрешения, будет очень плохо выглядеть на экране (к сожалению, современные броузеры выполняют очень примитивный ресайзинг картинок при показе), и будет достаточно много «весить». Все соображения о печатных картинках также относятся к случаю, когда вы переносите (например, копируя вебстраницу из броузера через клипборд) содержимое MediaWiki-статьи в MS Word или другой текстовый редактор.<br />
Для такого, «печатного» случая (т. е. если у вас не примитивные графы, и вы собираетесь их печатать или переносить в другую систему верстки), мы сделали «печатную версию» всех перечисленных графов, с разрешением около 200 DPI. Для этого надо использовать те же самые тэги с постфиксом «-print», например «graph-print»,«neato-print», и т.п.:<br />
<br />
<graph-print><br />
digraph G{<br />
rankdir=LR;<br />
node[color="red",fontsize=14];<br />
edge[color="darkgreen",fontcolor="blue",fontsize=12];<br />
OPEN[shape="rectangle",style="filled",fillcolor="lightgrey"];<br />
CLOSED[shape="octagon",label="Финиш"];<br />
VERIFIED[shape="rectangle",style="rounded"];<br />
OPEN->RESOLVED->VERIFIED->CLOSED;<br />
OPEN->CLOSED[style="bold"];<br />
VERIFIED->OPEN[label="обнаружены ошибки",style="dashed",arrowhead="dot"];<br />
}<br />
</graph-print><br />
<br />
Полученные картинки являются компромиссом, между весом, читаемостью на экране и читаемостью на бумаге.<br />
Желательно не использовать для совершенно тривиальных графов, или графов, которых вы не собираетесь печатать.<br />
<br />
= Установка GraphViz =<br />
== Установка на MoWeS Portable ==<br />
<br />
= Ссылки и дополнительная документация =<br />
<br />
Онлайн-документация, +последние изменения, FAQ и прочее можно найти на домашней странице пакета<br />
http://www.graphviz.org/Documentation.php<br />
<br />
<br />
<br />
[[Category:Документирование]]<br />
{{replicate-from-custiswiki-to-lib}}<br />
{{replicate-from-custiswiki-to-all}}</div>
Картограф