Лекция 1.6. Графвиз — различия между версиями

Материал из Wiki
Перейти к:навигация, поиск
(Простейший граф)
 
(не показано 56 промежуточных версий этого же участника)
Строка 1: Строка 1:
'''Graphviz''' — это разработанный специалистами лаборатории AT&T пакет утилит по автоматической визуализации графов, заданных в виде текстового описания. Пакет распространяется с открытыми исходными файлами и работает на всех операционных системах, включая Windows, Linux/Unix, Mac OS. Самой интересной программой пакета является «dot», автоматический визуализатор направленных графов, который принимает на вход текстовый файл со структурой графа, а на выходе формирует граф в виде графического, векторного или текстового файла.
+
'''Graphviz''' - набор утилит для графического представления данных.  
 
 
'''Графвиз''' - набор утилит для графического представления данных.  
 
 
Программа  принимает описания отношений и элементов множеств, на которых определяется граф, и "добавляет" к этим лишенным всяких геометрических атрибутов описаниям дополнительную информацию, позволяющую "нарисовать" картинку графа.
 
Программа  принимает описания отношений и элементов множеств, на которых определяется граф, и "добавляет" к этим лишенным всяких геометрических атрибутов описаниям дополнительную информацию, позволяющую "нарисовать" картинку графа.
  
Строка 10: Строка 8:
 
* ребро графа, соединяющее вершину N с вершиной M
 
* ребро графа, соединяющее вершину N с вершиной M
  
=== Простейший граф ===
+
== Быстрый старт ==
  
'''<nowiki><graphviz>digraph G {rankdir=LR ;Привет ->  Читатель ;}</graphviz></nowiki>'''
+
Входной файл для программы «DOT» является обычным текстовым файлом на специальном языке разметки графа. Структура файла очень простая, например,
  
Программа сама распознает все связи графа и упорядочит его таким образом, чтобы было наименьшее количество пересечений.
+
<nowiki> <graphviz>
 +
digraph G{
 +
Рождение->Юность->Зрелость->Старость->Смерть;
 +
Юность->Смерть;
 +
Зрелость->Смерть;
 +
}
 +
</graphviz></nowiki>
  
 +
на выходе будет:
  
<graphviz>digraph G{rankdir=LR ;Привет -> Читатель ;}</graphviz>
+
<graphviz>  
 +
digraph G{
 +
Рождение->Юность->Зрелость->Старость->Смерть;
 +
Юность->Смерть;
 +
Зрелость->Смерть;
 +
}
 +
</graphviz>
  
 +
Программа «Dot» сама распознает все связи графа и упорядочит его таким образом, чтобы было наименьшее количество пересечений.
  
Если у вас узлы поименованы словосочетаниями, заключите их в кавычки, т. е.
+
Если у вас узлы поименованы словосочетаниями, заключите их в кавычки, например:
  
<nowiki><graphviz>
+
<nowiki> <graphviz>
digraph G{
+
digraph G{
"Коржуков Валентин Григорьевич" -> "Коржуков Максим Валентинович" [label="отец"];
+
"Сидоров Пётр Фёдорович" -> "Сидоров Иван Петрович" [label="отец"];
"Миронова Татьяна Рудольфовна" -> "Коржуков Максим Валентинович" [label="мать"];
+
"Сидорова Анна Павловна " -> "Сидоров Иван Петрович" [label="мать"];
}  
+
}  
</graphviz></nowiki>
+
</graphviz></nowiki>
  
 
<graphviz>
 
<graphviz>
digraph G{
+
digraph G{
"Коржуков Валентин Григорьевич" -> "Коржуков Максим Валентинович" [label="отец"];
+
"Сидоров Пётр Фёдорович" -> "Сидоров Иван Петрович" [label="отец"];
"Миронова Татьяна Рудольфовна" -> "Коржуков Максим Валентинович" [label="мать"];
+
"Сидорова Анна Павловна " -> "Сидоров Иван Петрович" [label="мать"];
}  
+
}  
</graphviz>
+
</graphviz>
  
===Свойства графа===
+
==Свойства графа==
  
 
Для того, граф было удобнее просматривать, можно настроить следующие  свойства. Например:
 
Для того, граф было удобнее просматривать, можно настроить следующие  свойства. Например:
Строка 50: Строка 62:
 
** '''fontcolor="blue"''' - цвет шрифта = голубой
 
** '''fontcolor="blue"''' - цвет шрифта = голубой
 
** '''shape="none"''' - форма = "без формы"  
 
** '''shape="none"''' - форма = "без формы"  
*** '''Формы узла [shape=?]''' - '''invtriangle''' - треугольник вершиной вниз; '''box''' - прямоугольник; '''ellipse''' - эллипс; '''invtrapezium''' - перевёрнутая трапеция; '''triangle''' - треугольник;  '''trapezium''' - трапеция; '''record''' -  ; '''doubleoctagon''' - двойной восьмиугольник ; '''octagon''' - восьмиугольник; '''tripleoctagon''' - тройной восьмиугольник ([http://www.graphviz.org/doc/info/shapes.html Все формы])
+
*** '''Формы узла [shape=?]''' - '''invtriangle''' - треугольник вершиной вниз; '''box''' - прямоугольник; '''ellipse''' - эллипс; '''invtrapezium''' - перевёрнутая трапеция; '''triangle''' - треугольник;  '''trapezium''' - трапеция; '''octagon''' - восьмиугольник; '''tripleoctagon''' - тройной восьмиугольник ([http://www.graphviz.org/doc/info/shapes.html Все формы])
 
** '''Ярославль [shape=Mdiamond]''' - узлу Ярославль придаётся форма ромба(алмаз)
 
** '''Ярославль [shape=Mdiamond]''' - узлу Ярославль придаётся форма ромба(алмаз)
 
** '''Сызрань [shape=Msquare]''' - узлу Сызрань придаётся форма квадрата
 
** '''Сызрань [shape=Msquare]''' - узлу Сызрань придаётся форма квадрата
Строка 57: Строка 69:
 
** '''Казань [shape=hexagon,color=green]''' - узлу Казань придаётся форма шестиугольника и зелёный цвет  
 
** '''Казань [shape=hexagon,color=green]''' - узлу Казань придаётся форма шестиугольника и зелёный цвет  
 
* Управление положением узлов - '''{rank=same; Елабуга Дзержинск Сызрань ;}''' - узлам Елабуга, Дзержинск, Сызрань предан  разряд = тот же самый;  '''ranksep=3''' - расстояние между разрядами;  
 
* Управление положением узлов - '''{rank=same; Елабуга Дзержинск Сызрань ;}''' - узлам Елабуга, Дзержинск, Сызрань предан  разряд = тот же самый;  '''ranksep=3''' - расстояние между разрядами;  
* '''Свойства'''(edge)'''ребер''' - edge[color="blue",fontcolor="Green",fontsize=12]
+
* '''Свойства''' (edge) '''ребер''' - edge[color="blue",fontcolor="Green",fontsize=12]
 
** '''color="Brown"''' - цвет = коричневый
 
** '''color="Brown"''' - цвет = коричневый
 
*** '''color="Green:blue:red"''' - трёхцветие (возможно любое количество)
 
*** '''color="Green:blue:red"''' - трёхцветие (возможно любое количество)
Строка 67: Строка 79:
 
* '''Ярлык ребра''' [label="Волга"] - все связи  '''Ярославль -> ... -> Сызрань'''  будут помечены меткой Волга.   
 
* '''Ярлык ребра''' [label="Волга"] - все связи  '''Ярославль -> ... -> Сызрань'''  будут помечены меткой Волга.   
  
 +
 +
 +
'''''Пример:'''''
  
 
  <nowiki><graphviz>
 
  <nowiki><graphviz>
Строка 82: Строка 97:
 
  }
 
  }
 
  </graphviz></nowiki>
 
  </graphviz></nowiki>
 +
 +
'''''Результат:'''''
 +
 
<graphviz>
 
<graphviz>
 
  digraph G{
 
  digraph G{
Строка 97: Строка 115:
 
  </graphviz>
 
  </graphviz>
  
=== Гипертекстовые ссылки на страницы ===
+
== [http://lib.custis.ru/index.php/Graphviz Побробнее о Graphviz] ==
 
 
Ссылки на внутренние страницы устанавливаются прямым связыванием: 
 
* ПскоВики  - '''[URL=ПскоВики]'''
 
 
 
Кроме того, мы можем в начале графа указать, что все элементы поименованные в графе должны ссылаться на страницы с соответстующим названием.
 
'''node [URL="/index.php/\N"]''' ;
 
 
 
После этого можно просто указывать имена узлов, а гипертекстовые ссылки добавятся к ним автоматически.
 
 
 
Для того, чтобы имя заметки на ребре так же становилось ссылкой на страницу, необходимо дополнить метку ссылкой '''[label="ПскоВики", URL="ПскоВики"]'''. В графе, который представлен ниже все узлы и метки являются гиперссылками.
 
 
 
<nowiki><graphviz>
 
digraph G{
 
rankdir=LR ;
 
node[color="Green",fontsize=9, fontcolor="blue"] ;
 
edge[color="Green",fontcolor="blue",fontsize=8] ;
 
node [URL="/index.php/\N"] ;
 
Категории -> "Категория:Тьюторы" -> "Категория:Участник" ->  "Категория:Учитель"  [label="ПскоВики",URL="ПскоВики"] ;
 
}
 
</graphviz></nowiki>
 
 
 
 
 
<graphviz>
 
digraph G{
 
rankdir=LR ;
 
node[color="Green",fontsize=9, fontcolor="blue"] ;
 
edge[color="Green",fontcolor="blue",fontsize=8] ;
 
node [URL="/index.php/\N"] ;
 
Категории -> "Категория:Тьюторы" -> "Категория:Участник" -> "Категория:Учитель"  [label="ПскоВики",URL="ПскоВики"] ;
 
}
 
</graphviz>
 
 
 
Ссылки на внешние источники устанавливаются прямым связыванием с адресом web-сайта:
 
* ПскоВики [URL="http://wiki.pskovedu.ru/index.php/Заглавная_страница"]
 
 
 
<nowiki><graphviz>
 
digraph G{
 
rankdir=LR ;
 
node[color="red",fontsize=9, fontcolor="blue", shape="none"] ;
 
edge[color="red",fontcolor="blue",fontsize=8] ;
 
node [URL="/index.php/\N"] ;
 
Тест -> Проект [style=dotted, label="ПскоВики", URL="http://wiki.pskovedu.ru/index.php/  Заглавная_страница"] ;
 
}
 
</graphviz>
 
</nowiki>
 
<graphviz>
 
digraph G{
 
rankdir=LR ;
 
node[color="red",fontsize=9, fontcolor="blue", shape="none"] ;
 
edge[color="red",fontcolor="blue",fontsize=8] ;
 
node [URL="/index.php/\N"] ;
 
Тест -> Проект [style=dotted, label="ПскоВики", URL="http://wiki.pskovedu.ru/index.php/Заглавная_страница"] ;
 
}
 
</graphviz>
 
 
 
 
 
===Использование групп подграфа===
 
В структуре графа можно образовать несколько групп использую дополнение - '''subgraph cluster_0 {}'''
 
 
 
<nowiki><graphviz> digraph G {
 
subgraph cluster0 {
 
  style=filled;
 
  color=DeepSkyBlue;
 
  node [style=filled,color=white];
 
  "Учебные проекты" -> "Сообщество школ" -> "Сетевые проекты" -> "Участники сообщества";
 
  label = "Летописи.ру";
 
  }
 
subgraph cluster1 {
 
  node [style=filled];
 
  Проекты -> школы -> тьюторы -> учителя;
 
  label = "ПскоВики";
 
  color=blue
 
  "Учебные проекты" -> Проекты
 
  учителя -> "Участники сообщества"
 
  Проекты -> "Сетевые проекты"
 
        }
 
}</graphviz></nowiki>
 
 
 
<graphviz> digraph G {
 
subgraph cluster0 {
 
  style=filled;
 
  color=DeepSkyBlue;
 
  node [style=filled,color=white];
 
  "Учебные проекты" -> "Сообщество школ" -> "Сетевые проекты" -> "Участники сообщества";
 
  label = "Летописи.ру";
 
  }
 
subgraph cluster1 {
 
  node [style=filled];
 
  Проекты -> школы -> тьюторы -> учителя;
 
  label = "ПскоВики";
 
  color=blue
 
  "Учебные проекты" -> Проекты
 
  учителя -> "Участники сообщества"
 
  Проекты -> "Сетевые проекты"
 
        }
 
}</graphviz>
 
 
 
 
 
 
 
= Быстрый старт =
 
 
 
Входной файл для программы «DOT» является обычным текстовым файлом на специальном языке разметки графа. Структура файла очень простая, например,
 
 
 
digraph G{
 
  Рождение->Юность->Зрелость->Старость->Смерть;
 
  Юность->Смерть;
 
  Зрелость->Смерть;
 
}
 
 
 
на выходе будет
 
 
 
<graphviz>
 
digraph G{
 
Рождение->Юность->Зрелость->Старость->Смерть;
 
Юность->Смерть;
 
Зрелость->Смерть;
 
}
 
</graphviz>
 
 
 
Программа «Dot» сама распознает все связи графа и упорядочит его таким образом, чтобы было наименьшее количество пересечений.
 
 
 
Чтобы использовать «dot»-графы в {{SITENAME}}, используйте следующий синтаксис:
 
 
 
<nowiki><graph>
 
digraph G{
 
  Рождение->Юность->Зрелость->Старость->Смерть;
 
  Юность->Смерть;
 
  Зрелость->Смерть;
 
}
 
</graph></nowiki>
 
 
 
 
 
<nowiki><graph>
 
digraph G{
 
  "Полет фантазии"->"Расход горючего";
 
}
 
</graph></nowiki>
 
 
 
Поздравляем! Теперь вы способны рисовать графы в {{SITENAME}}. Остальной текст будет посвящен некоторым тонкостям использования Graphviz.
 
 
 
= Внешний вид графа =
 
«Dot» позволяет изменять внешний вид графа. Например, можно изменять форму фигур (прямоугольники, овалы, круги, параллелограммы, многоугольники), цвет и шрифт текста, цвет фона фигур, стиль стрелок и рамок фигур, подписи стрелок и т. д.
 
Итак, основные объектами являются узлы («node») и ребра («edge»). Для того, чтобы настроить свойства всех узлов или ребер нужно вначале использовать команды
 
node[свойство1="значение1",свойство2="значение2",...]
 
edge[свойство1="значение1",свойство2="значение2",...]
 
Также (в квадратных скобках после описания объекта) можно изменять настройки конкретного узла или ребра. Параметры графа, просто задаются в виде <tt>параметр=значение</tt>.
 
Полезно запомнить параметр «rankdir», он может быть «TB» (top->bottom, параметр по умолчанию), или «LR» (left->right), и определяет, сверху-вниз, или справа-налево, нужно располагать узлы графа. Вот пестрый пример:
 
 
 
digraph G{
 
  rankdir=LR;
 
  node[color="red",fontsize=14];
 
  edge[color="darkgreen",fontcolor="blue",fontsize=12];
 
  OPEN[shape="rectangle",style="filled",fillcolor="lightgrey"];
 
  CLOSED[shape="octagon",label="Финиш"];
 
  VERIFIED[shape="rectangle",style="rounded"];
 
  OPEN->RESOLVED->VERIFIED->CLOSED;
 
  OPEN->CLOSED[style="bold"];
 
  VERIFIED->OPEN[label="обнаружены ошибки",style="dashed",arrowhead="dot"];
 
}
 
 
 
на выходе будет
 
 
 
<graphviz>
 
digraph G{
 
rankdir=LR;
 
node[color="red",fontsize=14];
 
edge[color="darkgreen",fontcolor="blue",fontsize=12];
 
OPEN[shape="rectangle",style="filled",fillcolor="lightgrey"];
 
CLOSED[shape="octagon",label="Финиш"];
 
VERIFIED[shape="rectangle",style="rounded"];
 
OPEN->RESOLVED->VERIFIED->CLOSED;
 
OPEN->CLOSED[style="bold"];
 
VERIFIED->OPEN[label="обнаружены ошибки",style="dashed",arrowhead="dot"];
 
}
 
</graphviz>
 
 
 
Если предполагается, что граф будут не только просматривать через IE, но и печатать, то необходимо установить ширину картинки, иначе при печати картинка будет обрезана. Для этого следует задать внутри описания
 
size="6.7,15";
 
Существенна только первая цифра. Число 6.7 подобрано эмпирически, оно обеспечивает печать полной картинки при настройках IE по умолчанию.
 
 
 
 
 
 
 
= Многосекционный узлы =
 
 
 
Dot позволяет создавать многосекционные узлы при это каждая секция может быть поименована, и тогда ребра можно продоводить между секциями и узлами.
 
 
 
Для включения режима многосекционности устанавливается атрибут узла shape.
 
shape=record;
 
 
 
Секции описываются в атрибуте label узла,  с помощью разделителя «|». Для именования секции ее имя указывается в <>. При описание ребра, исходящего или входящего в секцию, секция именуется следующим образом:
 
 
 
элемент:<имя_секции>
 
 
 
Например, из такого описания:
 
 
 
digraph structs {
 
  rankdir=HR;
 
  first [shape=record,label="  x1\n all | { x21 | <f0> x22| x23} | x3" ];
 
  second [shape=record,label=" x22_1 | x22_2 | x22_3"];
 
  first:<f0> -> second;
 
}
 
 
 
Получается следующее:
 
 
 
<graphviz>
 
digraph structs {
 
  rankdir=HR;
 
  first [shape=record,label="  x1\n all | { x21 | <f0> x22| x23} | x3" ];
 
  second [shape=record,label=" x22_1 | x22_2 | x22_3"];
 
  first:<f0> -> second;
 
}
 
</graphviz>
 
 
 
= Гиперссылки на графах =
 
 
 
Можно использовать атрибут «URL», задавая относительные или абсолютные гиперссылки для узлов и ребер. Например
 
 
 
<nowiki><graph>
 
digraph G {
 
    rankdir=LR;
 
            SGML [URL="SGML"];
 
            HTML [URL="HTML"];
 
            XML [URL="XML"];
 
            XHTML [URL="http://www.w3schools.com/xhtml/"];
 
    SGML->HTML;
 
    SGML->XML;
 
    HTML->XHTML;
 
    XML->XHTML;
 
    SGML->XHTML[color="red",fontcolor="blue",label="ссылка на Google",URL="http://www.google.com"];
 
}
 
</graph></nowiki>
 
 
 
 
 
<graphviz>
 
digraph G {
 
    rankdir=LR;
 
            SGML [URL="SGML"];
 
            HTML [URL="HTML"];
 
            XML [URL="XML"];
 
            XHTML [URL="http://www.w3schools.com/xhtml/"];
 
    SGML->HTML;
 
    SGML->XML;
 
    HTML->XHTML;
 
    XML->XHTML;
 
    SGML->XHTML[color="red",fontcolor="blue",label="ссылка на Google",URL="http://www.google.com"];
 
}
 
</graphviz>
 
 
 
 
 
 
 
 
 
 
 
= Задание для самостоятельной работы =
 
Используя графвиз отобразите сферу ваших интересов и увлечений.
 
 
 
 
 
 
 
 
 
  
[[Категория:Семинар]]
+
[[Категория:Веб 2.0]]

Текущая версия на 10:00, 19 февраля 2015

Graphviz - набор утилит для графического представления данных. Программа принимает описания отношений и элементов множеств, на которых определяется граф, и "добавляет" к этим лишенным всяких геометрических атрибутов описаниям дополнительную информацию, позволяющую "нарисовать" картинку графа.

Для использования Графвиз требуется использовать примитивный язык описания графов dgl. Основные понятия:

  • граф,
  • вершина графа -- элемент множества,
  • ребро графа, соединяющее вершину N с вершиной M

Быстрый старт

Входной файл для программы «DOT» является обычным текстовым файлом на специальном языке разметки графа. Структура файла очень простая, например,

 <graphviz> 
 digraph G{
 Рождение->Юность->Зрелость->Старость->Смерть;
 Юность->Смерть;
 Зрелость->Смерть;
 }
 </graphviz>

на выходе будет:

<graphviz> digraph G{ Рождение->Юность->Зрелость->Старость->Смерть; Юность->Смерть; Зрелость->Смерть; } </graphviz>

Программа «Dot» сама распознает все связи графа и упорядочит его таким образом, чтобы было наименьшее количество пересечений.

Если у вас узлы поименованы словосочетаниями, заключите их в кавычки, например:

 <graphviz>
 digraph G{
 "Сидоров Пётр Фёдорович" -> "Сидоров Иван Петрович" [label="отец"];
 "Сидорова Анна Павловна " -> "Сидоров Иван Петрович" [label="мать"];
 } 
 </graphviz>

<graphviz>

digraph G{
"Сидоров Пётр Фёдорович" -> "Сидоров Иван Петрович" [label="отец"];
"Сидорова Анна Павловна " -> "Сидоров Иван Петрович" [label="мать"];
} 
</graphviz>

Свойства графа

Для того, граф было удобнее просматривать, можно настроить следующие свойства. Например:

  • Направленность графа:
    • rankdir=LR - слева-направо
    • rankdir=TB - сверху вниз
    • ratio=auto - отношение = авто;
  • Цвет фона графа - graph [bgcolor=Snow2] - окрашивает фон в цвет - "серый снег"
  • Свойства (node) узлов - node[color="Pink",fontsize=10, style=filled, fontcolor="blue", shape="none"] (Сочетание двух и более слов записывается в кавычки - "Нижний Новгород")
    • color="Pink" - цвет = розовый (Цвета в Вики)
    • fontsize=8 - размер шрифта = 8
    • style=filled - стиль = заполненный (без неё узел прозрачен)
    • fontcolor="blue" - цвет шрифта = голубой
    • shape="none" - форма = "без формы"
      • Формы узла [shape=?] - invtriangle - треугольник вершиной вниз; box - прямоугольник; ellipse - эллипс; invtrapezium - перевёрнутая трапеция; triangle - треугольник; trapezium - трапеция; octagon - восьмиугольник; tripleoctagon - тройной восьмиугольник (Все формы)
    • Ярославль [shape=Mdiamond] - узлу Ярославль придаётся форма ромба(алмаз)
    • Сызрань [shape=Msquare] - узлу Сызрань придаётся форма квадрата
    • Кострома [shape=circle] - узлу Кострома придаётся форма круга
    • "Нижний Новгород" [shape=doublecircle] - узлу "Нижний Новгород" придаётся форма двойного круга
    • Казань [shape=hexagon,color=green] - узлу Казань придаётся форма шестиугольника и зелёный цвет
  • Управление положением узлов - {rank=same; Елабуга Дзержинск Сызрань ;} - узлам Елабуга, Дзержинск, Сызрань предан разряд = тот же самый; ranksep=3 - расстояние между разрядами;
  • Свойства (edge) ребер - edge[color="blue",fontcolor="Green",fontsize=12]
    • color="Brown" - цвет = коричневый
      • color="Green:blue:red" - трёхцветие (возможно любое количество)
    • dir=both - направление стрелки в две стороны
    • fontsize=8 - размер шрифта = 8
    • fontcolor="blue" - цвет шрифта = зелёный
    • style=dotted - стиль = пунктирная линия
    • arrowhead="dot" - голова стрелки = "точка", "none" - нет (Все формы)
  • Ярлык ребра [label="Волга"] - все связи Ярославль -> ... -> Сызрань будут помечены меткой Волга.


Пример:

<graphviz>
 digraph G{
 graph [bgcolor=Snow2];
 rankdir=LR ; // направление графа слева направо
 node[color="Pink",fontsize=8, fontcolor="blue",style=filled, shape="none"] ;
 edge[color="Brown",fontcolor="Green",fontsize=8] ;
 Ярославль -> Кострома -> "Нижний Новгород" -> Казань -> Сызрань [dir=both, label="Волга"];
 "Нижний Новгород" -> Дзержинск [style=dotted, label="Ока",arrowhead="dot" ] ;
 Казань -> Елабуга [label="Кама", color="Green:blue:red"] ;
 Ярославль [shape=Mdiamond], Сызрань [shape=Msquare], Кострома [shape=circle];
 "Нижний Новгород" [shape = doublecircle],Казань[shape=hexagon,color=green]
 {rank=same; Елабуга Дзержинск Сызрань ;}
 }
 </graphviz>

Результат:

<graphviz>

digraph G{
graph [bgcolor=Snow2];
rankdir=LR ; 
node[color="Pink",fontsize=8, fontcolor="blue",style=filled, shape="none"] ;
edge[color="Brown",fontcolor="Green",fontsize=8] ;
Ярославль -> Кострома -> "Нижний Новгород" -> Казань -> Сызрань [dir=both, label="Волга"];
"Нижний Новгород" -> Дзержинск [style=dotted, label="Ока",arrowhead="dot" ] ;
Казань -> Елабуга [label="Кама", color="Green:blue:red"] ;
Ярославль [shape=Mdiamond], Сызрань [shape=Msquare], Кострома [shape=circle];
"Нижний Новгород" [shape = doublecircle],Казань[shape=hexagon,color=green]
{rank=same; Елабуга Дзержинск Сызрань ;}

}

</graphviz>

Побробнее о Graphviz