Я пытаюсь визуализировать простой граф конечного автомата, используя Graphviz. Макет, созданный Graphviz, мне не совсем нравится. Я ожидал более компактного результата с более короткими краями.
До сих пор я пытался использовать группы и изменять веса ребер, но не очень удачно. Мне непонятно, почему Graphviz рисует график именно так и как настроить его алгоритм под себя. Есть ли какие-либо параметры, которые я могу установить для достижения этого? Или мне следует использовать другую команду, кроме dot
? Я попробовал neato
, но результат выглядел совершенно испорченным, и я снова не очень понимаю, что делаю...
Это мой лучший результат на данный момент:
Пытаясь визуализировать лучший макет -, чем этот, я думаю, что график выглядел бы лучше, если бы красные прямоугольники были выровнены по-другому, например, более компактно, как показано стрелками на этом рисунке :
. Я использовал dot
для создания графика, и исходный код выглядит следующим образом:
1 digraph JobStateDiagram
2 {
3 rankdir=LR;
4 size="8,5";
5
6 node [style="rounded,filled,bold", shape=box, fixedsize=true, width=1.3, fontname="Arial"];
7 Created [fillcolor=black, shape=circle, label="", width=0.25];
8 Destroyed [fillcolor=black, shape=doublecircle, label="", width=0.3];
9 Empty [fillcolor="#a0ffa0"];
10 Announced [fillcolor="#a0ffa0"];
11 Assigned [fillcolor="#a0ffa0"];
12 Working [fillcolor="#a0ffa0"];
13 Ready [fillcolor="#a0ffa0"];
14 TimedOut [fillcolor="#ffa0a0"];
15 Failed [fillcolor="#ffa0a0"];
16
17 {
18 rank=source; Created Destroyed;
19 }
20
21 edge [style=bold, fontname="Arial" weight=2]
22 Empty -> Announced [ label="announce" ];
23 Announced -> Assigned [ label="assign" ];
24 Assigned -> Working [ label="start" ];
25 Working -> Ready [ label="finish" ];
26 Ready -> Empty [ label="revoke" ];
27
28 edge [fontname="Arial" color="#aaaaaa" weight=1]
29 Announced -> TimedOut [ label="timeout" ];
30 Assigned -> TimedOut [ label="timeout" ];
31 Working -> TimedOut [ label="timeout" ];
32 Working -> Failed [ label="error" ];
33 TimedOut -> Announced [ label="announce" ];
34 TimedOut -> Empty [ label="revoke" ];
35 Failed -> Announced [ label="announce" ];
36 Failed -> Empty [ label="revoke" ];
37
38 edge [style=bold, fontname="Arial" weight=1]
39 Created -> Empty [ label="initialize" ];
40 Empty -> Destroyed [ label="finalize" ];
41 Announced -> Empty [ label="revoke" ];
42 Assigned -> Empty [ label="revoke" ];
43 Working -> Empty [ label="revoke" ];
44 }
Кроме того, кто-нибудь, пожалуйста, дайте мне знать, если я делаю какие-либо странные вещи в файле Graphviz выше --, любая обратная связь приветствуется.
Обновление:
Дальнейшие эксперименты и пробы некоторых предложений, таких как порты, данные пользователем marapet, еще больше запутали меня... Например, на картинке ниже, почему dot
решил нарисовать эти странные обходные пути для Working->Failed
и Failed->Announced
, как в отличие от более прямых линий?