Graphviz — Ещегодник https://tushavin.ru Информационно-образовательный сайт для студентов, аспирантов и коллег Тушавина В. А., созданный и наполняемый им самим безвозмездно в свободное от остальных забот время Mon, 21 Mar 2022 22:12:03 +0000 ru-RU hourly 1 https://i0.wp.com/tushavin.ru/wp-content/uploads/2016/09/cropped-веб1.png?fit=32%2C32&ssl=1 Graphviz — Ещегодник https://tushavin.ru 32 32 117157397 Рисуем графы онлайн и с помощью Excel https://tushavin.ru/risuem-grafy-onlajn-i-s-pomoshhyu-excel/ Mon, 21 Mar 2022 22:11:24 +0000 https://tushavin.ru/?p=2885 Читать далее «Рисуем графы онлайн и с помощью Excel»

]]>
Как выяснилось, теперь для того, чтобы нарисовать граф на языке описания dot с помощью graphviz не обязательно его устанавливать на свой компьютер, а можно просто воспользоваться соответствующим online-сервисом.

Пример схемы из статьи на этом сайте

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

Пример изображения в формате png

Ну, а теперь предположим, что у нас имеется задача нарисовать граф состояний некой условной системы по матрице переходов

X1(t)X2(t)X3(t)
X1(t+1)0,10,50,1
X2(t+1)0,200,2
X3(t+1)0,70,50,7
Исходные данные в табличном виде
Представление в Excel

Для того, чтобы сгенерировать соответствующие строки кода нам надо развернуть таблицу (unpivot table). Современный Excel делает это с помощью power query, а старый только с помощью кода на Visual Basic, например, такого:

Sub M_snb()
    sn = Cells(1).CurrentRegion
    x = Cells(1).CurrentRegion.Rows(1).SpecialCells(2).Count
    y = UBound(sn, 2) - x
   
    ReDim sp(1 To x * (UBound(sn) - 1), 1 To 4)
   
    For j = 1 To UBound(sp)
       m = (j - 1) Mod (UBound(sn) - 1) + 2
       n = (j - 1) \ (UBound(sn) - 1) + y + 1
       sp(j, 1) = sn(m, 1)
       sp(j, 2) = sn(m, 2)
       sp(j, 3) = sn(1, n)
       sp(j, 4) = sn(m, n)
    Next
   
    Cells(20, 1).Resize(UBound(sp), UBound(sp, 2)) = sp
End Sub

Добавив это код в нашу таблицу, можно запустить макрос M_snb и получим следующее:

Преобразованная с помощью макроса таблица

Нас интересуют строчки начиная с 23. Добавляем простую формулу (см. сроку формул) и заполняем её вниз. Обратите внимание, что в колонке A у нас момент времени (t+1), а в колонке С — момент времени t, поэтому склейка в строку идет именно так, как показано в формуле [(t)->(t+1)].

Знак «&» в Excel используется для склейки строк. Строки в Excel заключаются в кавычки. Две кавычки подряд внутри кавычек интепретируются Excel как символ одиночной кавычки.

Собираем код (строку № 27 с нулевым значением я удалил):

digraph G {
X1->X1 [label="0,1"]
X1->X2 [label="0,2"]
X1->X3 [label="0,7"]
X2->X1 [label="0,5"]
X2->X3 [label="0,5"]
X3->X1 [label="0,1"]
X3->X2 [label="0,2"]
X3->X3 [label="0,7"]
}
Граф к коду выше

Если надо теперь это представить чуть красивее, например, расписав состояния нашей системы, то можно в код добавить преамбулу, описывающую эти состояния.

Символ \n в данном случае обозначает перевод строки, что позволяет написать название в две строки, как показано на рисунке ниже.

digraph G {
X1 [label="X1\nвыключено"]
X2 [label="X2\nсломано"]
X3 [label="X3\nв ремонте"]
    
X1->X1 [label="0,1"]
X1->X2 [label="0,2"]
X1->X3 [label="0,7"]
X2->X1 [label="0,5"]
X2->X3 [label="0,5"]
X3->X1 [label="0,1"]
X3->X2 [label="0,2"]
X3->X3 [label="0,7"]
}
Итоговый результат

Таким вот несложным образом можно без особого труда нарисовать очень объемные графы.

]]>
2885