2011-01-12 18 views
21

Próbuję użyć kropki Graphviz (ale chcę użyć czegoś innego) do wygenerowania wykresu z długą "główną linią" węzłów, i wiele małych gałęzi. Chciałbym, żeby główna linia była prosta od lewej do prawej, z małymi gałęziami powyżej lub poniżej. Jednak Graphviz "równoważy" dwie gałęzie, więc kończę na krzywym wykresie.Wymuszanie węzłów "linii głównej" na prostej w Graphviz (lub alternatywach)

Aby zilustrować, oto szkic podobny do tego, co obecnie się:

Current Graph

I to jest to, co faktycznie chcę:

Wanted graph

Czy istnieje jakiś sposób, aby wymusić lub zachęcić Graphviz do wygenerowania wykresu takiego jak drugi? Możliwe, że będę mógł używać "manekinowych" drugich gałęzi, aby utworzyć trójstronny układ, a następnie ukryć/usunąć manekiny później, ale jeśli jest lepsza opcja, która byłaby lepsza.

Odpowiedz

28

Tutaj jest rozwiązanie za pomocą masy atrybut krawędzie,

digraph G { 
    rankdir="LR"; 
    node[width=0.15, height=0.15, shape=point]; 
    edge[weight=2, arrowhead=none]; 
    1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8; 
    edge[weight=1]; 
    2 -> 9 -> 10 ; 
    5-> 11 -> 12; 
} 

Wynik:

graphivz

+0

Wydaje się, że to wystarczy, ale wydaje się, że wymaga to skierowania wykresu. Mój został zdefiniowany jako niekierowany, ale nie ma żadnego szczególnego powodu, który powinien być, więc to powinno zadziałać. Dzięki. –

+0

Nie jestem pewien, czy będzie to możliwe jako graf nieprzesortowany, ale cieszę się, że to działa dla ciebie. – marapet

+2

Najlepszym sposobem na utworzenie nieukierunkowanego wykresu jest użycie skierowanego wykresu, ale ustaw 'edge [dir =" none "]'. Inną opcją jest 'dir =" back "', który używa kierunku '->' dla układu wykresu, ale rysuje strzałkę skierowaną w przeciwnym kierunku. –

28

Drugie rozwiązanie pomocą grupy atrybut węzłów - kolejny skierowany wykres:

Od th e odniesienia Graphviz plamek:

Jeśli punkty końcowe krawędzi należą do z samą grupę, to znaczy mają taką samą cechą grupę sparametryzowany do przejściach uniknąć i utrzymać krawędzie prosto .

Więc zaczynamy:

digraph g{ 
    rankdir="LR"; 
    node[width=0.15, height=0.15, shape=point, group=main]; 
    edge[arrowhead=none]; 
    1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8; 
    node[group=branches]; 
    2 -> 9 -> 10; 
    5 -> 11 -> 12; 
} 

Wyjście jest dokładnie taka sama jak w mojej pierwszej odpowiedzi.

+0

Dzięki, doceniam, że dałeś alternatywne rozwiązanie, mimo że już zaakceptowałem drugie. Wciąż jestem całkiem nowy w Graphviz, więc miło jest zobaczyć możliwe sposoby osiągnięcia takich rzeczy. –