Подтяните точечный график, сделав его более симметричным.

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

введите здесь описание изображения

Результат в порядке, но переход состояния очень похож на спагетти-монстра, и я понятия не имею, что я могу сделать, чтобы решить эту проблему. Я пробовал другие макеты: 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" ]
}

person Konrad Reiche    schedule 15.07.2011    source источник


Ответы (1)


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

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


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

сгруппированные узлы

Это работало нормально для Ожидание и Teminated, но не так хорошо для Ожидание по времени и Заблокировано — вероятно, потому что два ребра между этими узлами.

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

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


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

группа и соединение

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


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

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

person marapet    schedule 16.07.2011
comment
Это было очень полезно, спасибо. Я думаю, это лучшее, что вы можете получить. Вес и группа кажутся реальными! - person Konrad Reiche; 16.07.2011