2011-07-15 13 views
8

skompilować następujące wykres z: dot graph.dot -Tpdf -ograph.pdf i produkującydokręcić dot wykres czyniąc ją bardziej symetryczny

enter image description here

Wynik jest w porządku, ale przejściowy stan wyglądać dużo jak spagetthi potwora i mam nie mam pojęcia, co mogę zrobić, aby podejść do tego problemu. Próbowałem innych układów: twopi, neato, etc. Czy są parametry, które pozwalają wymusić na wykresie wygląd nieco bardziej symetryczny? Ponieważ ogólny obraz jest w porządku.

Dla mnie wygląda na to, że krawędzie używają minimalnej dostępnej przestrzeni do oprawienia opisów krawędzi, może to jest problem?

Czy mój projekt wykresu jest wadliwy? Czy powinienem zapisać różne przejścia stanu na jednej krawędzi, używając \ n, aby rozdzielić różne przejścia?

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" ] 
} 

Odpowiedz

6

Nie sądzę, że Twój projekt jest wadliwy, myślę, że jest w porządku. Składnia kropkowa jest czytelna i dlatego możliwa do utrzymania, a wynikiem jest to, jak automatycznie generowany wykres wygląda zazwyczaj podobnie.

Oczywiście można dodać drobne poprawki, aby ten konkretny wykres był lepszy (lub co najmniej inny). Niektóre z nich mogą okazać się trudne do wdrożenia, jeśli na przykład źródło twojego wykresu jest generowane przez aplikację. Oto kilka pomysłów:


Aby uzyskać układ będzie bardziej symetryczny, można próbować wyrównać węzły Czekam i Zakończony jak również czasowy oczekujące i Zablokowane przez ustawienie ich atrybut group na tę samą wartość (group=a i group=b).

grouped nodes

To działało w porządku dla Oczekiwanie i Teminated, ale nie tak dobrze Czasowej Oczekiwanie i Zablokowane - prawdopodobnie dlatego, że istnieją dwie krawędzie między tymi węzłami.

Możesz spróbować je wyprostować, wybierając jedną z krawędzi, które je łączą, i ustawiając wysoki jej atrybut na weight.

Poza tym, myślę, że wykres wygląda ładniej nad wszystkim dlatego, że krawędzie są gładsze i mniej niepotrzebnych krzywe, zwłaszcza - ale nie tylko - między Runnable i Oczekiwanie.


Efekt spaghetti wynika z wypustami - może to wygląda mniej spaghetti bez wypustów? I próbuje dodając splines=compound lub splines=ortho (ten sam wynik):

group and compound

wykres wykorzystuje nieco mniej miejsca w pionie.To nie jest spaghetti, ale to nie lepiej moim zdaniem ...


Możesz także spróbować splines=compound bez atrybutów grupy, powinien to uczynić wykres trochę bardziej zwarty (bug niekoniecznie ładniejsza). Lub po prostu bawić się ciężarem krawędzi, aby wyprostować szczególnie nieprzyjemne krawędzie.

W niektórych przypadkach concentrate może usuwać wykresy z dużą ilością równoległych krawędzi - w tym przypadku tak naprawdę nie pomaga.

+0

To było bardzo pomocne, dzięki. Myślę, że to najlepsze, co możesz dostać. Waga i grupa wydają się być prawdziwą okazją! –