
Множество точек — вершин a,b,c,d, — соединенных линиями — ребрами (A,B), (B,C), (B,D) — называют графом.
Одним из способов описания графов является язык DOT. Вот как на нем записывается структура показанного выше графа
graph G {
a -- b -- c;
b -- d;
}
Описание обычного графа на языке DOT начинается с ключевого слова graph:
graph имя_графа {
<описание графа>
}
а ориентированного графа — с digraph, после чего следует имя графа. Затем в фигурных скобках помещается описание вершин графа и связывающих их рёбер. Комментарии к описанию делаются так же, как в языке С. Каждая строка описания завершается точкой с запятой (;).
Рассмотренный нами граф построен с помощью R и пакета DiagrammeR.
library(DiagrammeR)
Структура графа, записанная на DOT, помещается в DiagrammeR внутрь функции grViz:
grViz("
graph G {
a -- b -- c;
b -- d;
}
")
В ориентированном графе нужно заменить линии '--' на стрелки '->':
grViz("
digraph DG {
a -> b -> c;
b -> d;
}
")

Настройка описания графа
Внешний вид графа можно разнообразить, задавая стили оформления как графа в целом, так и отдельных вершин и рёбер:
grViz("
digraph DG1 {
node[shape=circle];
// label - видимое название вершины
a [label='Foo'];
// shape - форма отображения вершины
b [shape=box];
// color - цвет ребра
a -> b -> c [color=blue];
// style - стиль линии ребра
b -> d [style=dotted];
}
")

Здесь атрибут node[shape=circle]; стоящий перед описанием вершин и ребер графа относится к графу в целом. В квадратных скобках указаны настройки описания вершин (nodes) графа. В данном случае настройка всего одна: вершина отображается в виде круга (circle). Пары атрибут=значение разделяются запятыми.
Смысл свойств отдельных вершин и ребер графа ясен из комментариев.
Горизонтальное расположение графа
По умолчанию графы строятся сверху вниз. Изменив это можно, указав атрибут графа rankdir='LR'. В результате граф будет строиться слева (L) направо (R):
grViz("
digraph DG {
rankdir='LR';
a -> b -> c;
b -> d;
}
")

Вершины графа без меток
Атрибут графа label='' отключает отображение меток вершин, кроме те, что заданы в яном виде:
grViz("
graph G {
node[label=''];
a -- b -- c;
b -- d;
b [label='label']
}
")

Метка вдоль ребра
grViz("
digraph DG2 {
node[label=''];
rankdir='LR';
1 -> 2 [label=A]; // вот она
1 -> 3;
}
")

Метка рядом с узлом (а не в узле)
grViz("
digraph DG2 {
node[label=''];
rankdir='LR';
1 [xlabel='0']; // вот она
1 -> 2;
1 -> 3;
}
")

Цвет метки
grViz("
digraph mydigraph {
node[label='', shape=circle];
rankdir='LR';
1 [xlabel='0', fontcolor=darkgreen] // вот он
1 -> 2 [label=A];
1 -> 3;
}
")

Поддержка HTML в метках
grViz("
digraph DG2 {
node[label='', shape=circle];
rankdir='LR';
1 [xlabel=<<b>0</b>>]; // вот
1 -> 2 [label=A];
1 -> 3;
}
")

Обратите внимание на две дополнительные скобки <,>! Они должны окружать разметку HTML.
Пример: метка в боксе
grViz("
digraph mydigraph {
node[label='', shape=circle];
rankdir='LR';
1 [xlabel=<<table border='1' cellborder='0'><tr><td>0</td></tr></table>>]; // вот
1 -> 2 [label=A];
1 -> 3;
}
")

Без cellborder='0' рамка вокруг числа будет двойной. Кавычки обязательны.
Расположение узлов графа на линии
можно добиться, придавая лежащим вдоль прямой ребрам больший вес (weight):
grViz("
digraph DG3 {
rankdir='LR';
node[width=0.15, height=0.15, shape=point];
edge[weight=2, arrowhead=none];
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8;
edge[weight=1];
2 -> 9 -> 10 ;
5-> 11 -> 12;
}
")

Другим вариантом решения будет группировка узлов с помощью атрибута group. Если узлы принадлежат одной группе, то их изображают в виде прямой.
grViz("
digraph g{
rankdir='LR';
node[width=0.15, height=0.15, shape=point, group=main];
edge[arrowhead=none];
1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8;
node[group=branches];
2 -> 9 -> 10;
5 -> 11 -> 12;
}
")

Подграфы
grViz("
digraph G {
subgraph G1{
a->b: 1
}
subgraph G2{
c->d: 2
}
}
")

Названия вершин должны быть разными, иначе подграфы объединяться в один граф.
Справочник
Рассмотрим наиболее популярные атрибуты графов.
Атрибуты графа
label="My Graph";— метка к графу в целом (подпись).rankdir=LR;— построение графа слева (Left) направо (Right), вместо принятого по умолчанию сверху (Top) вниз (Bottom).{rank=same; a, b, c }— группирует узлы, расположенные на одном уровне графа.splines='line';— устанавливает отображение ребер в виде отрезков прямых, без использования кривых линий.K=0.6;— при отображении графа играет роль коэффициента жесткости (если считать ребра графа "пружинами"). Может "раздвинуть" узлы дальше друг от друга.
Атрибуты вершин
[label="Some Label"]— метка вершины.[color="red"]— цвет вершины.[fillcolor="blue"]— закрашивает вершину указанным цветом.
Атрибуты ребер
[label="Some Label"]— метка ребра (удобно указывать вес ребра).[color="red"]— цвет ребра (удобно показывать путь на графе).[penwidth=2.0]— толщина линии, изображающей ребро (также удобно для демонстрации пути).
Размеры, цвет фона
fixedsize=true;— зафиксировать размер вершины (по умолчанию размер вершины подстраивается под размер помещенной в ней метки).size="1,1";— максимальные ширина и высота графа, в дюймах.resolution=72;— ожидаемое разрешение экрана, в dpi.bgcolor="#C6CFD532";— цвет фона.
Ссылки
- Drawing Graphs using Dot and Graphviz — больше примеров.
- Node, Edge and Graph Attributes — полный список атрибутов для описания графов на языке DOT.
Комментарии
comments powered by Disqus