Рисуем графы онлайн и с помощью 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"]
}
Итоговый результат

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