2012-07-21 11 views
6

Próbuję wizualizować prosty wykres maszyny skończonego stanu za pomocą Graphviz. Układ stworzony przez Graphviz nie jest całkowicie zgodny z moimi upodobaniami. Spodziewałem się bardziej zwartego wyniku z krótszymi krawędziami.Jak wpływać na układ elementów wykresu?

Do tej pory próbowałem używać grup i zmieniać ciężary krawędzi, ale nie było to dużo szczęścia. Nie jest dla mnie jasne, dlaczego Graphviz rysuje wykres tak, jak robi i jak dostosować swój algorytm do moich potrzeb. Czy są jakieś parametry, które mogę ustawić, aby to osiągnąć? A może powinienem użyć innego polecenia niż dot? Próbowałem neato, ale wynik wyglądał całkowicie zawiedli i znowu, ja naprawdę nie rozumiem, co robię ...

To mój najlepszy wynik do tej pory:

Finite State Machine, best result so far

Próba wizualizacji lepszy niż lay-out to, myślę, że wykres będzie wyglądał ładniej, jeśli czerwone budki były wyrównane inaczej, bardziej kompaktowy na przykład jak wskazano za pomocą strzałek na tym zdjęciu:

Finite State Machine, imagined better result

użyłem dot stworzyć wykres i jego kod źródłowy jest w następujący sposób:

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 } 

Również ktoś proszę dać mi znać, jeśli mam jakieś dziwne rzeczy w Graphviz złożyć powyżej - każda opinia jest mile widziana.


Aktualizacja:

Więcej eksperymentuje i próbuje jakieś sugestie jak porty, podanych przez marapet użytkownika, wzrosły moje zamieszanie ... Na przykład, na rysunku poniżej, dlaczego dot wybrać wyciągnąć te dziwne objazdy dla Working->Failed i Failed->Announced, w przeciwieństwie do prostszych linii?

Graph with strange long edges

+0

Istnieje kilka narzędzi grafvizujących układy ukierunkowane (dot, twopi, circo, patchwork, osage) patrz https://graphviz.gitlab.io/_pages/pdf/dot.1.pdf mogą być warte spróbowania. – qneill

Odpowiedz

9

Dla mnie twoje wyjście wygląda w porządku. TimedOut i Failed są oczywiście całkowicie na prawo, ponieważ istnieje od nich krawędź od Working. To najlepiej robi dot, a chociaż możesz wprowadzić kilka poprawek, aby dostosować układy graphviz, myślę, że lepiej jest użyć innego narzędzia, jeśli chcesz utworzyć określony układ wykresu i kontrolować wszystko.

Powiedziawszy to, zrobiłem to szybko z graphviz. Zmieniłem niektóre linie, aby utworzyć linię prostą ze wszystkimi zielonymi węzłami i wyrównać czerwone węzły, jak wskazano w pytaniu. Dodałem też koncentratory krawędziowych - wynik nie wygląda lepiej do mnie:

digraph JobStateDiagram 
{ 
    rankdir=LR; 
    size="8,5"; 
    concentrate=true; 

    node [style="rounded,filled,bold", shape=box, fixedsize=true, width=1.3, fontname="Arial"]; 
    Created [fillcolor=black, shape=circle, label="", width=0.25]; 
    Destroyed [fillcolor=black, shape=doublecircle, label="", width=0.3]; 
    Empty  [fillcolor="#a0ffa0"]; 
    Failed [fillcolor="#ffa0a0"]; 
    Announced [fillcolor="#a0ffa0"]; 
    Assigned [fillcolor="#a0ffa0"]; 
    Working [fillcolor="#a0ffa0"]; 
    Ready  [fillcolor="#a0ffa0"]; 
    TimedOut [fillcolor="#ffa0a0"]; 

    { 
    rank=source; Created; Destroyed; 
    } 
    { 
    rank=same;Announced;Failed; 
    } 
    { 
    rank=same;Assigned;TimedOut; 
    } 

    edge [style=bold, fontname="Arial", weight=100] 
    Empty  -> Announced [ label="announce" ]; 
    Announced -> Assigned [ label="assign"  ]; 
    Assigned -> Working [ label="start"  ]; 
    Working -> Ready  [ label="finish"  ]; 
    Ready  -> Empty  [ label="revoke", weight=1  ]; 

    edge [color="#aaaaaa", weight=1] 
    Announced -> TimedOut [ label="timeout" ]; 
    Assigned -> TimedOut [ label="timeout" ]; 
    Working -> TimedOut [ label="timeout" ]; 
    Working -> Failed [ label="error"  ]; 
    TimedOut -> Announced [ label="announce" ]; 
    TimedOut -> Empty  [ label="revoke"  ]; 
    Failed -> Announced [ label="announce" ]; 
    Failed -> Empty  [ label="revoke"  ]; 

    Created -> Empty  [ label="initialize" ]; 
    Empty  -> Destroyed [ label="finalize" ]; 
    Announced -> Empty  [ label="revoke"  ]; 
    Assigned -> Empty  [ label="revoke"  ]; 
    Working -> Empty  [ label="revoke"  ]; 
} 

graphviz output

Można również poprawić za pomocą portów w celu kontrolowania, gdzie krawędzie początek i koniec.

Co do Twojego pytania o dziwnych rzeczy w pliku dot: z wyjątkiem numerów linii (które ostatecznie pozwoliły mi umieścić tryb kolumny mojego edytora tekstu do dobrego wykorzystania) i wyrównując, plik wygląda dobrze do mnie.W miarę możliwości strukturyzuję moje pliki punktowe (właściwości wykresu, lista węzłów, grupowanie, krawędzie). Wystarczy mieć świadomość, że kolejność pierwszego pojawienia się węzłów może mieć wpływ na ostateczny układ.

+0

Dziękuję za podjęcie wysiłku, aby spróbować i dać mi kilka dodatkowych wskazówek. Mam zaktualizowane pytanie z pewnymi wynikami. Nie sądzę, żeby to było kompletne rozwiązanie, więc to zajmie trochę więcej eksperymentowania z mojej strony, aby osiągnąć to, czego szukam. –

Powiązane problemy