|
08.11.2013, 22:55 | #1 | ||
Platinum Member
Регистрация: 22.07.2010
Адрес: Санкт-Петербург
Сообщений: 3,304
|
Graphviz - Инструмент для визуализации графов
Пример дерева решений, построенного с помощью Graphviz. Использовалось для иллюстрации в теме. Код
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! Подробная инструкция на русском языке Если есть вопросы, готов попробовать ответить. |
||
---------
DNF is not an option
|
|||
Реклама | |
|
08.11.2013, 23:08 | #2 |
Silver Member
Регистрация: 12.02.2012
Сообщений: 614
|
Можно же оформить примерно так:
Graphviz — это разработанный специалистами лаборатории AT&T пакет утилит по автоматической визуализации графов, заданных в виде текстового описания. Пакет распространяется с открытыми исходными файлами и работает на всех операционных системах, включая Windows, Linux/Unix, Mac OS. Самой интересной программой пакета является «dot», автоматический визуализатор направленных графов, который принимает на вход текстовый файл со структурой графа, а на выходе формирует граф в виде графического, векторного или текстового файла. Ситуация: человек встречает змею и варианты развития событий представлены на блок-схеме по теории вероятности. А вы что написали? |
---------
Первичка профсоюза - наше всё!
Профсоюз контролирует ситуацию) |
|
08.11.2013, 23:10 | #3 |
Gold Member
Регистрация: 08.04.2012
Адрес: Воронеж
Сообщений: 2,046
|
|
---------
Грамотей-опричникъ
Сварщик я не настоящий, а сюда просто пописать зашел |
|
08.11.2013, 23:20 | #4 |
Platinum Member
Регистрация: 22.07.2010
Адрес: Санкт-Петербург
Сообщений: 3,304
|
Котова, у каждой темы есть цель. Цель этой темы -- дать представление об инструменте визуализации графов, а не решение задач про змей и детей. Копипастить википедию мне не интересно, Вы вот сходили по ссылке, не обломались и поняли, что это и с чем это едят.
На самом деле, очень многие вещи нарисовать таким образом гораздо проще, чем мышкой в графическом редакторе, а учитывая, что среди результирующих форматов есть 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]; } Последний раз редактировалось Hogfather; 09.11.2013 в 00:35. |
---------
DNF is not an option
|
|
08.11.2013, 23:32 | #5 |
Silver Member
Регистрация: 12.02.2012
Сообщений: 614
|
Hogfather маленько про синтаксисы поясните)
|
---------
Первичка профсоюза - наше всё!
Профсоюз контролирует ситуацию) |
|
09.11.2013, 00:27 | #6 |
Platinum Member
Регистрация: 22.07.2010
Адрес: Санкт-Петербург
Сообщений: 3,304
|
В принципе, по ссылке достаточно подробно все расписано, но давайте попробую.
Нужно представить, что хочешь нарисовать и нарисовать, связав вершины с помощью стрелочек, как показано ниже. Для этого запускаем программу gvedit из папки Graphviz в меню пуск. В окно копируем текст Код:
digraph G{ Адам->Каин Адам->Авель Адам->Сиф->Енос } Дальше лучше попробовать прочитать краткое описание по ссылке, там есть про синтаксис, и попробовать решить свою задачу, если он не будет получаться, то задать вопрос. Если вершина будет словосочетанием, то заключаем название в двойные кавычки: "Типа, вершина 1"->"Типа, вершина 2". Если нужно сделать перенос строк, то используем спецсимвол переноса строки "\n". Он используется, если внимательно посмотреть, в примере с детьми и змеями. Будет что-то вида "Типа\nвершина 1". Можно вершинам присваивать имена, а текст задавать в квадратных скобках, как атрибут label. В вышеприведенном примере есть, например Код:
snake [label="Встретили змею?", style=filled, fillcolor=antiquewhite;shape=ellipse]; Далее, внизу мы уже рисуем связи и задаём ребра графа. Код:
snake -> snakeNo [arrowhead=none]; snake -> gender [arrowhead=none]; Где-то так. Есть ложка дёгтя. Эта чудо-программа не понимает русские имена в каталогах и файлах, поэтому рекомендую создать папку с именем на английском языке в корне диска и там уже резвиться. Настройки по формату выходного файла можно получить нажав на пиктограмму мужика, бегущего с документом (вторая справа). Либо, как я, пользоваться командной строкой для запуска парсера, тогда всё равно, где находятся файлы. Еще одно описание, в котором , в частности, рассказывается про то, как сделать перенос строк и разные цвета в метке узла. Введение в GraphViz Последний раз редактировалось Hogfather; 09.11.2013 в 01:12. |
---------
DNF is not an option
|
|
16.06.2017, 13:46 | #7 |
Newbie
Регистрация: 16.06.2017
Сообщений: 1
|
Маршрутизатор в Graphviz
Как создать маршрутизатор межу двумя любыми узлами?
Как выделить все вышестоящие узлы с ребрами, идущими от заданного узла? Как выделить все нижестоящие узлы с ребрами, идущими от заданного узла? Можно ли его создать, используя возможности самой программы DOT, или надо привлекать другие языки и программные средства? |