Date Категория comp Теги R / DOT

Множество точек — вершин 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"; — цвет фона.

Ссылки



Комментарии

comments powered by Disqus