Портал аспирантов

Портал аспирантов (http://www.aspirantura.spb.ru/forum/index.php)
-   Software (программное обеспечение) (http://www.aspirantura.spb.ru/forum/forumdisplay.php?f=107)
-   -   Graphviz - Инструмент для визуализации графов (http://www.aspirantura.spb.ru/forum/showthread.php?t=12227)

Hogfather 08.11.2013 22:55

Graphviz - Инструмент для визуализации графов
 
[table 1 3 0]3^http://aspirantura.spb.ru/forum/pict...&pictureid=979 |
Внимание![BR]Автор темы совместно с Администрацией портала просит писать в эту тему только относящееся к Graphviz. Благодарности, разговоры о погоде, искромётный юмор будут безжалостно удаляться. Все "чмоки", пожалуйста, во флейме. Надеюсь на понимание.
[/table]


Пример дерева решений, построенного с помощью Graphviz. Использовалось для иллюстрации в теме.
http://aspirantura.spb.ru/forum/pict...pictureid=1382

Код

1. Устанавливаем программу
2. Создаем файл test.dot
Код:

digraph dtree {
        node [fontsize=8, shape=box];

        snake [label="Встретили змею?", style=filled, fillcolor=grey89];
        snakeNo [label="p=0,9 (Нет)\n---------\nЗмею не встретили!", shape=plaintext];
        snakeNo1 [label="p=0,9\n---------\np*2000*50=90000", style=filled, fillcolor=green];
        gender [label="p=0,1 (Да)\n---------\nЭто была девочка?",  shape=plaintext];
        boy [label="p=0,4 (Мальчик)\n---------\nИспугался?", shape=plaintext];
        girl [label="p=0,6 (Девочка)\n---------\nИспугалась?",  shape=plaintext];
        boyRY [label="p=0,1 (Испугался)\n---------\nУбежал в истерике",  shape=plaintext];
        boyRun[label="p=0.1*0.4*0.1=0.004\n---------\np*(-10000)*50=-2000", style=filled, fillcolor=red];
        boyRN [label="p=0,9 (Не испугался)\n---------\nСтал дразнить?",  shape=plaintext];
        boyStripN [label="p=0,5 (Нет)\n---------\nНе стал дразнить",  shape=plaintext];
        boyStripN1 [label="p=0.1*0.4*0.9*0.5=0.018\n---------\np*2000*50=1800", style=filled, fillcolor=green];
        boyStripY [label="p=0,5 (Да)\n---------\nЗмея кусила?",  shape=plaintext];
        boyBiteY [label="p=0,5 (Да)\n---------\nУкусила!",  shape=plaintext];
        boyBiteN [label="p=0,5 (Нет)\n---------\nПобрезговала",  shape=plaintext];
        boyBiteN1 [label="p=0.1*0.4*0.9*0.5*0.5=0.009\n---------\np*2000*50=900", style=filled, fillcolor=green];       
        boyBiteY1 [label="p=0.1*0.4*0.9*0.5*0.5=0.009\n---------\np*(-100000)*50=-45000", style=filled, fillcolor=red];

        girlRY [label="p=0,9 (Испугалась)\n---------\nУбежала в истерике",  shape=plaintext];
        girlRun[label="p=0.1*0.6*0.9=0.054\n---------\np*(-10000)*50=-27000", style=filled, fillcolor=red];
        girlRN [label="p=0,1 (Не испугалась)\n---------\nСтала дразнить?",  shape=plaintext];
        girlStripN [label="p=0,5 (Нет)\n---------\nНе стала дразнить",  shape=plaintext];
        girlStripN1 [label="p=0.1*0.6*0.1*0.5=0.003\n---------\np*2000*50=300", style=filled, fillcolor=green];
        girlStripY [label="p=0,5 (Да)\n---------\nЗмея кусила?",  shape=plaintext];
        girlBiteY [label="p=0,5 (Да)\n---------\nУкусила!",  shape=plaintext];
        girlBiteN [label="p=0,5 (Нет)\n---------\nПобрезговала!",  shape=plaintext];
        girlBiteN1 [label="p=0.1*0.6*0.1*0.5*0.5=0.0015\n---------\np*2000*50=150", style=filled, fillcolor=green];       
        girlBiteY1 [label="p=0.1*0.4*0.9*0.5*0.5=0.0015\n---------\np*(-100000)*50=-7500", style=filled, fillcolor=red];

        snake -> snakeNo [arrowhead=none];
        snakeNo -> snakeNo1 [arrowhead=none];
        snake -> gender [arrowhead=none];
        gender -> boy [arrowhead=none];
        gender -> girl [arrowhead=none];
        boy -> boyRY [arrowhead=none];
        boyRY -> boyRun [arrowhead=none];
        boy -> boyRN [arrowhead=none];
        boyRN -> boyStripN [arrowhead=none];
        boyRN -> boyStripY [arrowhead=none];
        boyStripY -> boyBiteY [arrowhead=none];       
        boyStripY -> boyBiteN [arrowhead=none];
        boyBiteN -> boyBiteN1 [arrowhead=none];       
        boyStripN -> boyStripN1 [arrowhead=none];
        boyBiteY -> boyBiteY1 [arrowhead=none];

        girlRY -> girlRun [arrowhead=none];
        girl -> girlRN [arrowhead=none];
        girl -> girlRY [arrowhead=none];
        girlRN -> girlStripN [arrowhead=none];
        girlRN -> girlStripY [arrowhead=none];
        girlStripY -> girlBiteY [arrowhead=none];       
        girlStripY -> girlBiteN [arrowhead=none];
        girlBiteN -> girlBiteN1 [arrowhead=none];       
        girlStripN -> girlStripN1 [arrowhead=none];
        girlBiteY -> girlBiteY1 [arrowhead=none];               
}

Как видите, язык достаточно простой, если кому-то нужно готов создать отдельную тему по этому.

3. В каталоге, где расположен файл запускаем команду dot test.dot -Tpng -o test.png
4. ...
5. PROFIT!



Подробная инструкция на русском языке

Если есть вопросы, готов попробовать ответить.

Котова 08.11.2013 23:08

Можно же оформить примерно так:
Graphviz — это разработанный специалистами лаборатории AT&T пакет утилит по автоматической визуализации графов, заданных в виде текстового описания. Пакет распространяется с открытыми исходными файлами и работает на всех операционных системах, включая Windows, Linux/Unix, Mac OS. Самой интересной программой пакета является «dot», автоматический визуализатор направленных графов, который принимает на вход текстовый файл со структурой графа, а на выходе формирует граф в виде графического, векторного или текстового файла.

Ситуация: человек встречает змею и варианты развития событий представлены на блок-схеме по теории вероятности.

А вы что написали?

Дмитрий В. 08.11.2013 23:10

Цитата:

Сообщение от Котова (Сообщение 404264)
Ситуация: человек встречает змею и варианты развития событий представлены на блок-схеме по теории вероятности.

Котова, в теме про пользу педагогического образования (sic!) даны условия задачи.

Hogfather 08.11.2013 23:20

Вложений: 1
Котова, у каждой темы есть цель. Цель этой темы -- дать представление об инструменте визуализации графов, а не решение задач про змей и детей. Копипастить википедию мне не интересно, Вы вот сходили по ссылке, не обломались и поняли, что это и с чем это едят.

На самом деле, очень многие вещи нарисовать таким образом гораздо проще, чем мышкой в графическом редакторе, а учитывая, что среди результирующих форматов есть SVG, то картина становится вообще радостная. Я использовал этот пакет для иллюстраций к статьям и диссертациям. Мой младенец рисовал топологию сети по курсовику. Но я сильно глубоко внутрь, как в GNU R, не залазил, поскольку задачки решал локальные. Поэтому и написал, что попробую ответить. А компетенции... Компетенции дело наживное, когда то их вообще не было и если только ими ограничиваться, то скоро кота кормить не на что будет.

Во вложении другой вариант того же графа, он сделан горизонтально и ранжирован.

Код
Код:

digraph dtree {rankdir=LR;
        node [fontsize=12, shape=box];
  { /* шкала месяцев*/
    node[shape=plaintext]; /* что бы не было видно рамок */
    edge[color=white] /* что бы не было видно стрелок */
    "змея" ->  "испуг" -> "убежал" -> "дразнит"-> "дразнит"->"кусила"-> "результат";
  }
 { rank = same; "змея"; "snakeNo"; "gender"; }
 { rank = same; "испуг"; "boy"; "girl"; }
 { rank = same; "убежал"; "boyRY"; "girlRY"; }
  { rank = same; "результат"; "snakeNo1"; "boyRun";"boyStripN1"; "girlRun";"girlStripN1";}
        snake [label="Встретили змею?", style=filled, fillcolor=antiquewhite;shape=ellipse];
        snakeNo [label="p=0,9 (Нет)\n---------\nЗмею не встретили!", shape=plaintext];
        snakeNo1 [label="p=0,9\n---------\np*2000*50=90000", style=filled, fillcolor=darkolivegreen1];
        gender [label="p=0,1 (Да)\n---------\nЭто была девочка?",  shape=plaintext];
        boy [label="p=0,4 (Мальчик)\n---------\nИспугался?", shape=plaintext];
        girl [label="p=0,6 (Девочка)\n---------\nИспугалась?",  shape=plaintext];
        boyRY [label="p=0,1 (Испугался)\n---------\nУбежал в истерике",  shape=plaintext];
        boyRun[label="p=0.1*0.4*0.1=0.004\n---------\np*(-10000)*50=-2000", style=filled, fillcolor=coral];
        boyRN [label="p=0,9 (Не испугался)\n---------\nСтал дразнить?",  shape=plaintext];
        boyStripN [label="p=0,5 (Нет)\n---------\nНе стал дразнить",  shape=plaintext];
        boyStripN1 [label="p=0.1*0.4*0.9*0.5=0.018\n---------\np*2000*50=1800", style=filled, fillcolor=darkolivegreen1];
        boyStripY [label="p=0,5 (Да)\n---------\nЗмея кусила?",  shape=plaintext];
        boyBiteY [label="p=0,5 (Да)\n---------\nУкусила!",  shape=plaintext];
        boyBiteN [label="p=0,5 (Нет)\n---------\nПобрезговала",  shape=plaintext];
        boyBiteN1 [label="p=0.1*0.4*0.9*0.5*0.5=0.009\n---------\np*2000*50=900", style=filled, fillcolor=darkolivegreen1];       
        boyBiteY1 [label="p=0.1*0.4*0.9*0.5*0.5=0.009\n---------\np*(-100000)*50=-45000", style=filled, fillcolor=coral];

        girlRY [label="p=0,9 (Испугалась)\n---------\nУбежала в истерике",  shape=plaintext];
        girlRun[label="p=0.1*0.6*0.9=0.054\n---------\np*(-10000)*50=-27000", style=filled, fillcolor=coral];
        girlRN [label="p=0,1 (Не испугалась)\n---------\nСтала дразнить?",  shape=plaintext];
        girlStripN [label="p=0,5 (Нет)\n---------\nНе стала дразнить",  shape=plaintext];
        girlStripN1 [label="p=0.1*0.6*0.1*0.5=0.003\n---------\np*2000*50=300", style=filled, fillcolor=darkolivegreen1];
        girlStripY [label="p=0,5 (Да)\n---------\nЗмея кусила?",  shape=plaintext];
        girlBiteY [label="p=0,5 (Да)\n---------\nУкусила!",  shape=plaintext];
        girlBiteN [label="p=0,5 (Нет)\n---------\nПобрезговала!",  shape=plaintext];
        girlBiteN1 [label="p=0.1*0.6*0.1*0.5*0.5=0.0015\n---------\np*2000*50=150", style=filled, fillcolor=darkolivegreen1];       
        girlBiteY1 [label="p=0.1*0.4*0.9*0.5*0.5=0.0015\n---------\np*(-100000)*50=-7500", style=filled, fillcolor=coral];

        snake -> snakeNo [arrowhead=none];
        snakeNo -> snakeNo1 [arrowhead=none];
        snake -> gender [arrowhead=none];
        gender -> boy [arrowhead=none];
        gender -> girl [arrowhead=none];
        boy -> boyRY [arrowhead=none];
        boyRY -> boyRun [arrowhead=none];
        boy -> boyRN [arrowhead=none];
        boyRN -> boyStripN [arrowhead=none];
        boyRN -> boyStripY [arrowhead=none];
        boyStripY -> boyBiteY [arrowhead=none];       
        boyStripY -> boyBiteN [arrowhead=none];
        boyBiteN -> boyBiteN1 [arrowhead=none];       
        boyStripN -> boyStripN1 [arrowhead=none];
        boyBiteY -> boyBiteY1 [arrowhead=none];

        girlRY -> girlRun [arrowhead=none];
        girl -> girlRN [arrowhead=none];
        girl -> girlRY [arrowhead=none];
        girlRN -> girlStripN [arrowhead=none];
        girlRN -> girlStripY [arrowhead=none];
        girlStripY -> girlBiteY [arrowhead=none];       
        girlStripY -> girlBiteN [arrowhead=none];
        girlBiteN -> girlBiteN1 [arrowhead=none];       
        girlStripN -> girlStripN1 [arrowhead=none];
        girlBiteY -> girlBiteY1 [arrowhead=none];
       
}


Котова 08.11.2013 23:32

Hogfather маленько про синтаксисы поясните)

Hogfather 09.11.2013 00:27

Цитата:

Сообщение от Котова (Сообщение 404284)
Hogfather маленько про синтаксисы поясните)

В принципе, по ссылке достаточно подробно все расписано, но давайте попробую.

Нужно представить, что хочешь нарисовать и нарисовать, связав вершины с помощью стрелочек, как показано ниже.
Для этого запускаем программу gvedit из папки Graphviz в меню пуск.
В окно копируем текст
Код:

digraph G{
  Адам->Каин
  Адам->Авель
  Адам->Сиф->Енос
 }

Нажимаем на самую правую иконку бегущего мужика и получаем:

http://aspirantura.spb.ru/forum/pict...pictureid=1385

Дальше лучше попробовать прочитать краткое описание по ссылке, там есть про синтаксис, и попробовать решить свою задачу, если он не будет получаться, то задать вопрос. Если вершина будет словосочетанием, то заключаем название в двойные кавычки: "Типа, вершина 1"->"Типа, вершина 2". Если нужно сделать перенос строк, то используем спецсимвол переноса строки "\n". Он используется, если внимательно посмотреть, в примере с детьми и змеями. Будет что-то вида "Типа\nвершина 1". Можно вершинам присваивать имена, а текст задавать в квадратных скобках, как атрибут label.
В вышеприведенном примере есть, например
Код:

snake [label="Встретили змею?", style=filled, fillcolor=antiquewhite;shape=ellipse];
Таким образом мы описали узел snake с текстом внутри "Встретили змею?", закрашенный (style=filled), задали цвет (fillcolor=antiquewhite) и сказали, что это эллипс (shape=ellipse).
Далее, внизу мы уже рисуем связи и задаём ребра графа.
Код:

        snake -> snakeNo [arrowhead=none];
        snake -> gender [arrowhead=none];

Вот этот arrowhead=none, на самом деле, лишнее. Можно было вверху задать общий признак всех ребер edge[arrowhead=none]; и не мучатся.
Где-то так.

Есть ложка дёгтя. Эта чудо-программа не понимает русские имена в каталогах и файлах, поэтому рекомендую создать папку с именем на английском языке в корне диска и там уже резвиться. Настройки по формату выходного файла можно получить нажав на пиктограмму мужика, бегущего с документом (вторая справа).

Либо, как я, пользоваться командной строкой для запуска парсера, тогда всё равно, где находятся файлы.

Еще одно описание, в котором , в частности, рассказывается про то, как сделать перенос строк и разные цвета в метке узла.

Введение в GraphViz

Бокар 16.06.2017 13:46

Маршрутизатор в Graphviz
 
Как создать маршрутизатор межу двумя любыми узлами?
Как выделить все вышестоящие узлы с ребрами, идущими от заданного узла?
Как выделить все нижестоящие узлы с ребрами, идущими от заданного узла?
Можно ли его создать, используя возможности самой программы DOT, или надо
привлекать другие языки и программные средства?


Текущее время: 18:08. Часовой пояс GMT +3.

Powered by vBulletin® Version 3.8.8
Copyright ©2000 - 2024, vBulletin Solutions, Inc. Перевод: zCarot
© 2001—2024, «Аспирантура. Портал аспирантов»