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";
}
po prostu idealny, po prostu mieć do optymalizacji układów, kolorów, krew Jezusa ... dzięki. =] – BrainStorm
@doug, czy mógłbyś mi powiedzieć, jak ustawić poziom węzła (linię) za pomocą parametru? tylko dla estetyki. – BrainStorm
@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