Множество точек — вершин 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