Затяните точечный график, сделав его более симметричным - PullRequest
9 голосов
/ 16 июля 2011

Я скомпилировал следующий график с: dot graph.dot -Tpdf -ograph.pdf, получив:

enter image description here

Результат в порядке, но переход между состояниями очень похож на монстра-спагетти, и у меня естьПонятия не имею, что я мог сделать, чтобы подойти к этой проблеме.Я пробовал другие макеты: twopi, neato, etc. Существуют ли параметры, позволяющие заставить график выглядеть немного более симметричным?Поскольку общая картина в порядке.

Мне кажется, что края используют минимальное пространство, доступное для обрамления описаний границ, может быть, в этом проблема?

Является ли мой дизайн графика некорректным?Должен ли я написать разные переходы состояний на одном ребре, используя \ n для разделения разных переходов?

digraph finite_state_machine {
    rankdir=LR;
    edge [fontsize=26];
    node [shape = doublecircle, width=2.0, fontsize=24, fixedsize=true,style=filled, colorscheme=spectral5]; New  [fillcolor=3] Terminated [fillcolor=5];
    node [shape = circle, width=2.0, fontsize=24, fixedsize=true, colorscheme=spectral5]; Runnable [fillcolor=4] Waiting [fillcolor=2] "Timed\nWaiting" [fillcolor=2] Blocked [fillcolor=1];
    New -> Runnable [ label = "Thread.start" ];
    Runnable -> Waiting [ label = "Object.wait" ];
    Runnable -> Waiting [ label = "Thread.sleep" ];
    Runnable -> Waiting [ label = "LockSupport.park" ];
    Waiting -> Blocked [ label = "Reacquire monitor lock after\nleaving Object.wait" ]
    Waiting -> Blocked [label = "Spurious wake-up"]
    "Timed\nWaiting" -> Blocked [ label = "Reaquire monitor lock after\n leaving Object.wait" ]
    "Timed\nWaiting" -> Terminated [ label = "Exception" ]
    "Timed\nWaiting" -> Blocked [ label = "Spurious wake-up" ]
    Runnable -> "Timed\nWaiting" [ label = "Object.wait" ];
    Runnable -> Blocked [ label = "Contended Monitor\nEnter" ];
    Blocked -> Runnable [ label = "Contended Monitor\nEntered" ];
    Runnable -> Terminated [ label = "Thread finishes\nexecution" ]
    Runnable -> Terminated [ label = "Exception" ]
    Waiting -> Runnable [ label = "Object.notify\nObject.notifyAll" ]
        Waiting -> Terminated [ label = "Exception" ]
    "Timed\nWaiting" -> Runnable [ label = "Object.notify\nObject.notifyAll" ]
}

1 Ответ

7 голосов
/ 16 июля 2011

Я не думаю, что ваш дизайн имеет недостатки, я думаю, что все в порядке.Точечный синтаксис является читаемым и, следовательно, обслуживаемым, и в результате автоматически генерируемый граф выглядит одинаково.

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


Чтобы макет был более симметричным , вы можете попытаться выровнять узлы Ожидание и Завершено а также Временное ожидание и Заблокировано , установив для их атрибута group одинаковое значение (group=a и group=b).

grouped nodes

Работало нормально для Ожидание и Teolated , но не так хорошо для Таймерное ожидание и Заблокировано - возможно, потому что между этими узлами есть два ребра.

Вы можете попытаться выровнять их, выбрав одно из ребер, которое связывает их, и установите его атрибут weight ввысокое значение.

Кроме этого, я думаю, что график выглядит лучше во всех отношениях, потому что края более гладкие и имеют меньше ненужных кривых, особенно - но не только - между Runnable и Ожидание .


Эффект спагетти обусловлен сплайнами - возможно, это выглядитEss спагетти без сплайнов?Я попытался добавить splines=compound или splines=ortho (тот же результат):

group and compound

График использует немного меньше вертикального пространства.Это не спагетти, но, на мой взгляд, не лучше ...


Вы также можете попробовать splines=compound без атрибутов группы, это должно сделать график немного более компактным (ошибка не обязательно красивее),Или просто поиграйтесь с весом ребер, чтобы выровнять особенно неприятные ребра.

В некоторых случаях concentrate может очистить графики с множеством параллельных ребер - в этом случае этоне очень помогает.

...