Próbuję stworzyć schemat blokowy struktury drzewa . Udało mi się stworzyć reprezentatywne wykresy za pomocą networkx, ale potrzebuję sposobu, aby pokazać strukturę drzewa , kiedy wyprowadzam wykres. Do wykreślenia wykresu używam matplotlib.pylab.
Muszę pokazać dane w strukturze podobnej do pokazanej tutaj . Chociaż nie mam pod-grafów.
Jak mogę zagwarantować taką strukturę?
Przykłady dla niewierzących:
Mogłem pokazać wykresy za pomocą pylab i graphviz, ale żadne z nich nie oferuje struktury drzewa, której szukam. Wypróbowałem każdy układ, jaki ma do zaoferowania networkx, ale żaden z nich nie pokazuje hierarchii . Po prostu nie jestem pewien, jakie opcje / tryb podać, LUB czy muszę użyć odważników. Wszelkie sugestie pomogłyby wielu.
@ jterrace:
Oto ogólny zarys tego, czego użyłem do stworzenia powyższych wykresów. Dodałem kilka etykiet, ale poza tym jest to to samo.
import networkx as nx
import matplotlib.pyplot as plt
G = nx.Graph()
G.add_node("ROOT")
for i in xrange(5):
G.add_node("Child_%i" % i)
G.add_node("Grandchild_%i" % i)
G.add_node("Greatgrandchild_%i" % i)
G.add_edge("ROOT", "Child_%i" % i)
G.add_edge("Child_%i" % i, "Grandchild_%i" % i)
G.add_edge("Grandchild_%i" % i, "Greatgrandchild_%i" % i)
plt.title("draw_networkx")
nx.draw_networkx(G)
plt.show()
g = nx.full_rary_tree(2, 10)
Jeśli wydrukuję krawędzie, które otrzymam:[(0, 1), (0, 2), (1, 3), (1, 4), (2, 5), ... ]
ale zwizualizuję je w innej kolejności ...pygraphviz
w regularny sposób, spróbujpip install --install-option="--include-path=/usr/local/include/" --install-option="--library-path=/usr/local/lib/" pygraphviz
graphviz
(w moim przypadku przy użyciubrew install graphviz
).Możesz użyć pygraphviz, aby się zbliżyć:
>>> import pygraphviz >>> import networkx >>> import networkx as nx >>> G = nx.Graph() >>> G.add_node("ROOT") >>> for i in xrange(5): ... G.add_node("Child_%i" % i) ... G.add_node("Grandchild_%i" % i) ... G.add_node("Greatgrandchild_%i" % i) ... G.add_edge("ROOT", "Child_%i" % i) ... G.add_edge("Child_%i" % i, "Grandchild_%i" % i) ... G.add_edge("Grandchild_%i" % i, "Greatgrandchild_%i" % i) >>> A = nx.to_agraph(G) >>> A.layout('dot', args='-Nfontsize=10 -Nwidth=".2" -Nheight=".2" -Nmargin=0 -Gfontsize=8') >>> A.draw('test.png')
Wynik:
Uwaga Skopiowałem opcje graphviz z linku, który zamieściłeś powyżej. Nie jestem pewien, dlaczego czwarte dziecko jest rysowane na górze, a nie w ściśle pionowym formacie. Może ktoś, kto wie więcej o opcjach Graphviz, może w tym pomóc.
źródło
to_agraph
Funkcja znajduje się teraznx.nx_agraph.to_agraph
.Możesz użyć grandalf jako rozwiązania tylko dla Pythona, jeśli nie chcesz instalować graphviz.
Ten typ wizualizacji nazywany jest również rysowaniem wykresów warstwowych lub rysowaniem wykresów w stylu Sugiyamy , które mogą wyświetlać wiele rodzajów wykresów, w tym wykresy niebędące drzewami.
Zobacz moją odpowiedź na inne pytanie, aby poznać szczegóły i implementację.
źródło