2015-04-20 26 views
7

Tôi đang cố tạo biểu đồ được gắn nhãn bằng networkx nhưng gặp sự cố khi nhận các nút và nhãn để bật ra chính xác. Trong ngắn hạn, các nhãn không xếp hàng trên các nút bên phải và có một số nút không có cạnh khi hiển thị.Hiển thị biểu đồ mạng có nhãn

Đầu tiên tôi tạo một biểu đồ, thêm các nút và cạnh, sau đó thêm nhãn.

Các dữ liệu đồ thị xuất phát từ một đối tượng gấu trúc DataFrame với hai cột, lao động và quản lý tên:

   emp_name    mgr_name 
0  Marianne Becker     None 
1   Evan Abbott  Marianne Becker 
2    Jay Page  Marianne Becker 
3    Seth Reese  Marianne Becker 
4   Maxine Collier  Marianne Becker 

...

Mỗi nút là một cái tên và các cạnh là mgr_name để emp_name mối quan hệ .

đang biểu đồ của tôi:

import networkx as nx 
G=nx.DiGraph() 

#set layout 
pos=nx.spring_layout(G) 

#add nodes 
G.add_nodes_from(df.emp_name) 
G.nodes() 
G.add_node('None') 

#create tuples for edges 
subset = df[['mgr_name','emp_name']] 
tuples = [tuple(x) for x in subset.values] 

#add edges 
G.add_edges_from(tuples) 
G.number_of_edges() 

#draw graph 
import matplotlib.pyplot as plt 
nx.draw(G, labels = True) 
plt.show() 

Lý tưởng nhất là tôi sẽ có một cấu trúc cây giống với tên của nhân viên như các nhãn cho mỗi nút.

hình ảnh đầu ra là enter image description here

+0

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

+0

Điều này đã được sắp xếp sau khi tất cả? –

Trả lời

12

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_labelsedge_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 Output of <code>draw_networkx</code>

Sản lượng draw_graphviz Output of <code>draw_graphviz</code>

Sản lượng dot mà không cạnh trực giao Output of <code>dot</code> without orthogonal edges

Đầu ra của dot với các cạnh trực giao Output of <code>dot</code> with orthogonal edges

Hy vọng điều này sẽ hữu ích.

Các vấn đề liên quan