Networkx có một số chức năng để vẽ đồ thị mà còn cho phép người dùng kiểm soát tốt hơn toàn bộ quá trình.
draw
là cơ bản và docstring của nó đề cập cụ thể:
Vẽ đồ thị như là một đại diện đơn giản không có nodeabels hoặc cạnh nhãn và sử dụng đầy đủ Matplotlib khu vực con số nhãn theo mặc định. Xem draw_networkx() để vẽ fatured hơn cho phép tiêu đề, trục nhãn
Các chức năng bắt đầu bằng draw_networkx
Tiếp theo edges
, nodes
, edge_labels
và edge_nodes
cho phép kiểm soát tốt hơn quá trình vẽ tổng thể.
Ví dụ của bạn hoạt động tốt khi sử dụng draw_networkx
.
Ngoài ra, nếu bạn đang tìm kiếm một đầu ra tương tự như một organogram, tôi sẽ đề nghị sử dụng graphviz thông qua networkx. Đồ thị dot
của Graphviz lý tưởng cho loại biểu đồ này (vui lòng see this cho dấu chấm).
Trong phần tiếp theo, tôi đã cố gắng để thay đổi mã của bạn một chút để chứng minh việc sử dụng cả hai chức năng:
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()
Bạn cũng có thể thử sử dụng dấu chấm graphviz từ dòng lệnh trực tiếp bằng cách lưu mạng networkx của bạn thông qua nx.write_dot
.Để làm điều này:
Từ bên trong kịch bản python của bạn:
nx.write_dot(G, 'test.dot')
Sau đó, từ (linux) dòng lệnh của bạn và giả định rằng bạn đã cài đặt 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.
Đối với một điển hình hơn định dạng tổ chức, bạn có thể buộc định tuyến cạnh trực giao theo
Cuối cùng, đây là outpu ts
Sản lượng draw_networkx
Sản lượng draw_graphviz
Sản lượng dot
mà không cạnh trực giao
Đầu ra của dot
với các cạnh trực giao
Hy vọng điều này sẽ hữu ích.
Câu trả lời cho 'G.number_of_edges()' là gì? Nó sẽ là tuyệt vời nếu bạn có thể thêm một hình ảnh --- Tôi không nghĩ rằng bạn có đủ 'danh tiếng' để làm điều đó, nhưng bạn có thể đặt nó trực tuyến một nơi nào đó và gửi một liên kết? Tôi không thể thấy bất kỳ lỗi rõ ràng nào. – Joel
Điều này đã được sắp xếp sau khi tất cả? –