NetworkX posiada szereg funkcji do rysowania wykresów, lecz także umożliwiają użytkownikowi precyzyjną kontrolę nad całym procesem.
draw
jest proste i jego docstring szczególności wymienia:
Draw wykres Jako, że prosty, bez nodeabels lub krawędź etykiet i za pomocą pełnych matplotlib obszary postać etykiety domyślnie. Patrz draw_networkx() przez fatured rysunku, który umożliwia tytuł, oś etykiet
Funkcje poprzedzone przez draw_networkx
następnie edges
, nodes
, edge_labels
i edge_nodes
umożliwiających lepszą kontrolę w całym procesie ciągnienia.
Twój przykład zadziałał prawidłowo podczas korzystania z draw_networkx
.
Ponadto, jeśli szukasz wyjścia przypominającego organogram, sugeruję użycie graphviz przez siećx. Graphviz's dot
jest idealny dla tego rodzaju schematów (proszę również see this dla kropki).
W dalszej Próbowałem zmodyfikować kod nieznacznie wykazać korzystania z obu funkcji:
import networkx as nx
import matplotlib.pyplot as plt
import pandas
#Build the dataset
df = pandas.DataFrame({'emp_name':pandas.Series(['Marianne Becker', 'Evan Abbott', 'Jay Page', 'Seth Reese', 'Maxine Collier'], index=[0,1,2,3,4]), 'mgr_name':pandas.Series(['None', 'Marianne Becker', 'Marianne Becker', 'Marianne Becker', 'Marianne Becker'], index = [0,1,2,3,4])})
#Build the graph
G=nx.DiGraph()
G.add_nodes_from(df.emp_name)
G.nodes()
G.add_node('None')
#
#Over here, you are manually adding 'None' but in reality
#your nodes are the unique entries of the concatenated
#columns, i.e. emp_name, mgr_name. You could achieve this by
#doing something like
#
#G.add_nodes_from(list(set(list(D.emp_name.values) + list(D.mgr_name.values))))
#
# Which does exactly that, retrieves the contents of the two columns
#concatenates them and then selects the unique names by turning the
#combined list into a set.
#Add edges
subset = df[['mgr_name','emp_name']]
tuples = [tuple(x) for x in subset.values]
G.add_edges_from(tuples)
G.number_of_edges()
#Perform Graph Drawing
#A star network (sort of)
nx.draw_networkx(G)
plt.show()
t = raw_input()
#A tree network (sort of)
nx.draw_graphviz(G, prog = 'dot')
plt.show()
Można również spróbować użyć kropki Graphviz jest z linii poleceń bezpośrednio, zapisując swoje NetworkX sieci poprzez nx.write_dot
.Aby to zrobić:
z poziomu skryptu Pythona:
nx.write_dot(G, 'test.dot')
Po tym, z (Linux) linii poleceń i przy założeniu, że masz zainstalowany Graphviz:
dot test.dot -Tpng>test_output.png
feh test_output.png #Feh is just an image viewer.
firefox test_output.png & #In case you don't have feh installed.
Dla bardziej typowy format organogramu, możesz wymusić ortogonalne trasowanie krawędzi przez:
dot test.dot -Tpng -Gsplines=ortho>test_output.png
Wreszcie, tutaj są outpu ts
Wyjście draw_networkx
wyjściu draw_graphviz
Wyjście dot
bez prostopadłych krawędziach
Wyjście dot
z prostopadłych krawędziach
Nadzieja to pomaga.
Jaka jest odpowiedź na 'G.number_of_edges()'? Byłoby wspaniale, gdybyś mógł dodać obraz - nie sądzę, żebyś miał dość "reputacji", aby to zrobić, ale czy możesz umieścić go gdzieś online i opublikować link? Nie widzę żadnego oczywistego błędu. – Joel
Czy było to jednak posortowane? –