2011-08-11 8 views
9

Czy ktoś wie, jak wykreować drzewo wielopasmowe w estetyczny i wiarygodny sposób? informacje:Rysowanie i renderowanie drzewa Multiway w pythniku ​​

  • mniej więcej 100 pozycji
  • każdy poziom mają w przybliżeniu taką samą liczbę elementów
  • 10 stopni
  • każdy węzeł ma od 0 (k) i 6 Childs
  • każdy węzeł określ swój własny poziom, bez względu na jego korzenie.

obecnie używam PIL, dzieląc każdą „linia” w img.size()[0]/liczby węzłów, a rysowanie linii z draw.line do reprezentowania krawędzie, ale jest całkowicie zawiedli

Mam nadzieję, że można pomóż mi =], potrzebuję informacji, które opublikuję.

Odpowiedz

15

Tak więc, renderowanie wykresów jest szczególnym geniuszem graphviz, który również ma kilka bibliotek udostępniających wiązania Pythona. Moim zdaniem najlepszą z tych bibliotek jest pygraphviz. Graphviz jest prawdopodobnie najlepszym rozwiązaniem, a także najprawdopodobniej najprostszym.

Konkretny układ można opisać w swoim pytaniu, hierarchicznej, warstwowego systemu, odbywa się bez wysiłku przez graphviz”kropka silnika układu. Punkt wykonuje renderowanie w celu zapewnienia, że ​​wykres jest ułożony w naturalnej konfiguracji drzewa - tj. Węzły nadrzędne są umieszczone nad ich dziećmi; węzły o równej randze (poziomy od korzenia) są wyrównane w miarę możliwości w/r/t osi Y, a naturalna symetria jest zachowywana, o ile jest to możliwe.

(Uwaga: złudzenia, kropka odnosi się do jednego z kilku silników układ które zawierają Graphviz, ale kropka jest także nazwa i plik rozszerzenie formatu plików dla wszystkich dokumentów Graphviz niezależnie od tego, jak są renderowane).

Jak widać w moim kodu, który następuje, używając pygraphviz, to proste, aby wybrać kropkę jako silnik układu dla wykresu, choć nie jest to faktycznie domyślny (neato jest).

Oto szybki wykres zrobiłem a następnie renderowane przy użyciu kropkę --created i renderowane przy użyciu graphviz poprzez pygraphviz.

Należy zauważyć, że wykres jest idealny układ - węzłów o tym samym stopniu są na tym samym poziomie, wzdłuż osi pionowej, dzieci są renderowane poniżej rodziców i naturalny „symetria” jest zachowany, jeśli to możliwe (na przykład, węzeł nadrzędny jest umieszczona pomiędzy dwoma węzłami podrzędnymi i nad nimi. Jak widać, żaden z moich kodów nie kontroluje ręcznie układu - graphviz, tj. dot, obsługuje go automatycznie.

import pygraphviz as PG 

A = PG.AGraph(directed=True, strict=True) 

A.add_edge("7th Edition", "32V") 
A.add_edge("7th Edition", "Xenix") 
# etc., etc. 

# save the graph in dot format 
A.write('ademo.dot') 

# pygraphviz renders graphs in neato by default, 
# so you need to specify dot as the layout engine 
A.layout(prog='dot') 


# opening the dot file in a text editor shows the graph's syntax: 
digraph unix { 
    size="7,5"; 
    node [color=goldenrod2, style=filled]; 
    "7th Edition" -> "32V"; 
    "7th Edition" -> "V7M"; 
    "7th Edition" -> "Xenix"; 
    "7th Edition" -> "UniPlus+"; 
    "V7M" -> "Ultrix-11"; 
    "8th Edition" -> "9th Edition"; 
    "1 BSD" -> "2 BSD"; 
    "2 BSD" -> "2.8 BSD"; 
    "2.8 BSD" -> "Ultrix-11"; 
    "2.8 BSD" -> "2.9 BSD"; 
    "32V" -> "3 BSD"; 
    "3 BSD" -> "4 BSD"; 
    "4 BSD" -> "4.1 BSD"; 
    "4.1 BSD" -> "4.2 BSD"; 
    "4.1 BSD" -> "2.8 BSD"; 
    "4.1 BSD" -> "8th Edition"; 
    "4.2 BSD" -> "4.3 BSD"; 
    "4.2 BSD" -> "Ultrix-32"; 
} 

enter image description here

+0

po prostu idealny, po prostu mieć do optymalizacji układów, kolorów, krew Jezusa ... dzięki. =] – BrainStorm

+0

@doug, czy mógłbyś mi powiedzieć, jak ustawić poziom węzła (linię) za pomocą parametru? tylko dla estetyki. – BrainStorm

+0

@BrainStorm: cóż, kropka zwykle zajmuje się tym bez żadnej dodatkowej konfiguracji. Aby wymusić konfigurację tego węzła - ustaw wyraźne ograniczenie - nie jest trudne, ale wymaga dwóch kroków: (i) zdefiniuj "podgraf" (grupa węzłów na wykresie ma równą pozycję poziomą); oraz (ii) w definicji podgrafi ustawić atrybut "ranga", tak jak to: ranking = to samo. Za mało miejsca w komentarzach, aby dokładniej wyjaśnić podgraph, ale ta strona daje prosty przykład: http://www.graphviz.org/content/cluster – doug