2014-09-23 137 views
3

我正在使用networkx繪製網絡中節點位於字段上給定位置的圖形。該字段被分成設定數量的單元格,節點位置對應於一個單元格。繪製圖形時,我想在背景中顯示網格,以便圖形中的單元格和距離可見。 networkx提供了一個選項嗎?我找不到一個。我試圖通過pyplot設置網格:使用networkx繪製圖形時顯示背景網格(也稱單元格)

plt.xlim(0,14) 
plt.ylim(0,10) 
plt.xticks([x for x in xrange(0,14)]) 
plt.yticks([x for x in xrange(0,10)]) 
plt.grid(True) 

其作品本身(見here),但是當還呼籲

它顯示的圖形沒有網格(見here)。我猜測網格仍然在後臺,但是networkx完全覆蓋了它。

那麼有沒有什麼方法可以顯示與plt網格或可能networkx命令,我沒有找到它允許類似的東西?

編輯:這是使用的完整代碼。看到其中的差別時(UN)評論nx.draw(G,pos)

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


def quit_figure(event): 
    if event.key == 'q': 
     plt.close(event.canvas.figure) 

nodes = [[1,1],[3,1],[6,1],[3,2],[13,1],[3,5]] 
distance_array = [ 
    [[],[],[1,3],[],[5],[],[],[],[],[],[],[],[],[],[]], 
    [[],[3],[0],[2],[],[],[],[],[],[],[],[],[],[],[]], 
    [[],[],[],[1,3],[5],[],[],[4],[],[],[],[],[],[]], 
    [[],[1],[0],[2,5],[],[],[],[],[],[],[10],[],[],[],[]], 
    [[],[],[],[],[],[],[],[2],[],[],[3,5],[],[],[],[]], 
    [[],[],[],[3],[0,2],[],[],[],[],[],[4],[],[],[],[],[]], 
    [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]], 
    [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]], 
    [[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]]] 

current_transmission_range = 0 
transmission_range = np.zeros((len(nodes)), dtype=int) 

pos = {x:[nodes[x][0],nodes[x][1]] for x in xrange(len(nodes))} 
graph_nodes = [x for x in xrange(len(nodes))] 


current_transmission_range = 0 
cid = plt.gcf().canvas.mpl_connect('key_press_event', quit_figure) 
plt.xlim(0,14) 
plt.ylim(0,10) 
plt.xticks([x+0.5 for x in xrange(0,14)], ['  '+str(x) for x in xrange(0,13)]) 
plt.yticks([x+0.5 for x in xrange(0,10)], ['\n\n'+str(x)+'\n\n\n\n' for x in xrange(0,9)]) 
plt.grid(True) 

G = nx.Graph() 
for node in graph_nodes: 
    G.add_node(node) 
for node in graph_nodes: 
    for j in xrange(transmission_range[node]+1): 
     for k in distance_array[node][j]: 
      if(j <= current_transmission_range): 
       G.add_edge(node, k,weight=j) 

edge_weight=dict([((u,v,),int(d['weight'])) for u,v,d in G.edges(data=True)]) 
nx.draw_networkx_edge_labels(G, pos,edge_labels=edge_weight) 
# draw graph 
# nx.draw(G, pos) 
plt.show() 
+0

之後你有沒有試過['hold'參數(HTTP://networkx.lanl .GOV /參考/生成/ networkx.drawing.nx_pylab.draw.html#networkx.drawing.nx_pylab.draw)? – goncalopp 2014-09-23 13:20:05

+0

剛試過,沒有改變任何東西。但我只是看到了一個「斧頭」的論點,這應該可能有幫助。只需要弄清楚 – Simon 2014-09-23 13:28:36

回答

1

使用plt.grid( '開')

import networkx as nx 
import matplotlib.pyplot as plt 

G = nx.path_graph(4) 
nx.draw_networkx(G) 
plt.grid('on') 
plt.show() 

如果你想使用nx.draw(G)而不是nx.draw_networkx(G)還必須打開軸與plt.axis('on')

enter image description here

+0

的工作方式,非常感謝!不過'nx.draw(G)'不起作用,但我必須改成'nx.draw_networkx(G)'(如你所建議的)。也許你可以改變你的第一句話來使用plt.grid('on')'和'nx.draw_networkx(G)'「,這樣就更清楚了。 – Simon 2014-09-23 13:49:25

0

NetworkX's draw explicitly turns off axis

你能避免使用draw並調用圖形子功能來代替:

#... 
nx.draw_networkx_nodes(G,pos) 
nx.draw_networkx_edges(G,pos) 
plt.show() 

或者使用draw_networkx,作爲ARIC建議。

如果您正在尋找對圖紙的長期控制(因爲draw實施可能會更改),建議您採用這種方法。

當然,如果不放心,你可以簡單地做plt.axes().set_axis_on()調用draw

enter image description here