Drzewo ukorzenione w Pythonie - wizualizacja

0
import numpy as np
import networkx as nx
import matplotlib.pyplot as plt

df = pd.DataFrame({ 'from':['A', 'A', 'A', 'D', 'D', 'D', 'H', 'H', 'B', 'B', 'F'], 'to':['D', 'C', 'B', 'H', 'I', 'G', 'K', 'L', 'E', 'F', 'J']})
print(df)

G = nx.from_pandas_edgelist(df, 'from', 'to')

nx.draw(G, with_labels=True)
plt.show()

Napisałam powyższy kod, który tworzy mi graf z jego wizualizacją. Jednak chciałabym ten graf ukorzenić, bo w moich wizualizacjach nie ma głównego węzła (wierzchołka). Czy ktoś może ma pomysł jak mogę tego dokonać? Męczę się z tym niemiłosiernie, nie mogąc znaleźć odpowiedzi na ten problem.

0

OK, Utworzyłaś spójny, acykliczny graf (czyli drzewo). Co Masz na myśli "ukorzenić", dowolny wierzchołek może być jego korzeniem, zależy, jak na to patrzeć:)

0

No właśnie: 'dowolny wierzchołek może być jego korzeniem'. Chodzi mi o to, że chciałabym by moje drzewo było rysowane począwszy od wierzchołka, który wyznaczę. Np. jeżeli korzeniem jest mój punkt A to całe drzewo rozchodzi się od tego wierzchołka. Wiem, że istnieją funkcje, które w networkxie jakoś to drzewo potrafią ukorzenić, ale próbowałam wszystkiego i nie potrafię tego wykonać.

0

Rzuć okiem tutaj//stackoverflow.com/questions/48380550/using-networkx-to-output-a-tree-structure

0

Czytałam już ten post właśnie ;) Problem jest taki, że u mnie za Chiny nie chce przejść pakiet tam używany. No i, nie mogłabym tergo raczej przerobić pod własne potrzeby, gdzie potrzebuję by wizualizacja zmieniała się po mój wybór. Jak wybiorę wierzchołek A to chcę by od niego rozgałęziało się drzewo, jak wierzchołek D to od niego, itd.

1

Załóżmy, że chcesz, by drzewo było ukorzenione w punkcie A. Aby graf przekształcić na drzewo, trzeba wykorzystać moduł graphviz_layout [link].

import networkx as nx
import matplotlib.pyplot as plt
import pandas as pd
from networkx.drawing.nx_agraph import graphviz_layout

df = pd.DataFrame({ 'from':['A', 'A', 'A', 'D', 'D', 'D', 'H', 'H', 'B', 'B', 'F'], 'to':['D', 'C', 'B', 'H', 'I', 'G', 'K', 'L', 'E', 'F', 'J']})
G = nx.from_pandas_edgelist(df, 'from', 'to')

pos = graphviz_layout(G, prog='dot')
nx.draw(G, pos, with_labels=True, arrows=False)
plt.show()

treeA.png
Ten jednak sposób nie zawsze da Ci to, co chcesz. Posortujmy pierwszą listę malejąco:

df.sort_values(by='from', ascending=False, inplace=True)
G = nx.from_pandas_edgelist(df, 'from', 'to')

I drzewo wygląda następująco:
treeH.png
Generalnie staraj się umieścić etykietę, która ma pełnić rolę korzenia, na pierwszej pozycji w liście.

0

Dziękuję. Już uporałam się z problemem za pomocą pakeitu ete3 :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1