2013-09-01 124 views
6

Tôi đang thử networkx và hiển thị trong matplotlib, tôi bị nhầm lẫn bởi vì tôi không hiểu rõ cách chúng tương tác với nhau? Có ví dụ đơn giảnTương tác giữa networkx và matplotlib

import matplotlib.pyplot 
import networkx as nx 
G=nx.path_graph(8) 
nx.draw(G) 
matplotlib.pyplot.show() 

Tôi nên nói pyplot ở đâu mà tôi muốn vẽ biểu đồ G? Tôi đoán rằng việc sử dụng nx.draw cái gì đó như matplotlib.pyplot {cốt truyện, vv ...} Vì vậy, nếu tôi muốn vẽ 2 đồ thị:.

import matplotlib.pyplot 
import networkx as nx 

G=nx.path_graph(8) 
E=nx.path_graph(30) 
nx.draw(G) 

matplotlib.pyplot.figure() 
nx.draw(E) 
matplotlib.pyplot.show() 

Sau đó ... ít thí nghiệm

import networkx as nx 
G=nx.path_graph(8) 
E=nx.path_graph(30) 
nx.draw(G) 
import matplotlib.pyplot 
matplotlib.pyplot.figure() 
nx.draw(E) 
import matplotlib.pyplot as plt 
plt.show() 

Xin đừng giết tôi về mã ngu ngốc này, tôi chỉ đang cố gắng hiểu - làm thế nào để networkx vẽ một cái gì đó matplotlib, trong khi nó thậm chí không nhập khẩu được nêu ra!

P.S: Xin lỗi vì tiếng Anh của tôi.

Trả lời

13

Chỉ cần tạo hai trục khác nhau nếu bạn muốn vẽ đồ thị riêng biệt hoặc tạo một đối tượng Axes đơn lẻ để chuyển nó tới nx.draw. Ví dụ:

G = nx.path_graph(8) 
E = nx.path_graph(30) 

# one plot, both graphs 
fig, ax = subplots() 
nx.draw(G, ax=ax) 
nx.draw(E, ax=ax) 

để có được:

enter image description here

Nếu bạn muốn hai khác nhau đối tượng hình sau đó tạo ra một cách riêng biệt, như vậy:

G = nx.path_graph(8) 
E = nx.path_graph(30) 

# two separate graphs 
fig1 = figure() 
ax1 = fig1.add_subplot(111) 
nx.draw(G, ax=ax1) 

fig2 = figure() 
ax2 = fig2.add_subplot(111) 
nx.draw(G, ax=ax2) 

năng suất:

enter image description here enter image description here

Cuối cùng, bạn có thể tạo ra một âm mưu phụ nếu bạn muốn, như thế này:

G = nx.path_graph(8) 
E = nx.path_graph(30) 

pos=nx.spring_layout(E,iterations=100) 

subplot(121) 
nx.draw(E, pos) 

subplot(122) 
nx.draw(G, pos) 

kết quả là:

enter image description here

Đối với bất cứ điều gì nó có giá trị nó trông giống như lập luận ax đến nx.draw là vô ích với matplotlib 's API khi bạn muốn tạo phụ các lô bên ngoài pylab, bởi vì nx.draw có một số cuộc gọi đến gca làm cho nó phụ thuộc vào giao diện pylab. Đã không thực sự đào sâu vào lý do tại sao, chỉ nghĩ rằng tôi sẽ chỉ ra nó.

Các mã nguồn để nx.draw là khá đơn giản:

try: 
    import matplotlib.pylab as pylab 
except ImportError: 
    raise ImportError("Matplotlib required for draw()") 
except RuntimeError: 
    print("Matplotlib unable to open display") 
    raise 

cf=pylab.gcf() 
cf.set_facecolor('w') 
if ax is None: 
    if cf._axstack() is None: 
     ax=cf.add_axes((0,0,1,1)) 
    else: 
     ax=cf.gca() 

# allow callers to override the hold state by passing hold=True|False 

b = pylab.ishold() 
h = kwds.pop('hold', None) 
if h is not None: 
    pylab.hold(h) 
try: 
    draw_networkx(G,pos=pos,ax=ax,**kwds) 
    ax.set_axis_off() 
    pylab.draw_if_interactive() 
except: 
    pylab.hold(b) 
    raise 
pylab.hold(b) 
return 
  1. Một nhân vật được chụp từ môi trường sử dụng gcf.
  2. Sau đó, đối tượng Axes được thêm vào hình nếu không tồn tại, nếu không, hãy lấy nó từ môi trường sử dụng gca.
  3. Làm cho màu mặt âm mưu trắng
  4. lượt hold trên
  5. vẽ nó với một chức năng nội
  6. tắt các trục
  7. cuối cùng nếu chúng ta đang ở chế độ tương tác, vẽ nó và reraise bất kỳ trường hợp ngoại lệ mà đã bị bắt
+0

Cảm ơn rất nhiều về tổng quan và câu trả lời tuyệt vời này! – user1113159