2017-07-03 170 views
0

我打算動畫一個networkx圖隨着時間的推移而增長。我有 它與彎曲的邊緣和所有工作。非常高興,但是隨着圖表 的增長,它變慢了!任何人都可以解釋或更改給定的代碼以更快運行。我認爲這不是我的電腦問題。 注:即使沒有花式彎曲的邊緣,它非常緩慢。一個簡單的nx.draw會導致同樣的問題非常緩慢的網絡圖動畫在Python的matplotlib與networkx


import time 
from matplotlib import pyplot as plt 
from matplotlib import animation 
import networkx as nx 
from matplotlib.patches import FancyArrowPatch, Circle 
import numpy as np 

mainGraph = nx.DiGraph() 
nodeToCoordinate_dict = {} 
label_coordinatePositions = {} 
edgeLabel_coordinatePositions = {} 
edgeLabel_values_dict = {} 
fig = plt.figure() 


#============================================================= 

def draw_network(G,pos,ax,sg=None): 
    e = None 
    for n in G: 
     c=Circle(pos[n],radius=0.02,alpha=0.5) 
     ax.add_patch(c) 
     G.node[n]['patch']=c 
     x,y=pos[n] 
    seen={} 
    for (u,v,d) in G.edges(data=True): 
     n1=G.node[u]['patch'] 
     n2=G.node[v]['patch'] 
     rad=0.1 
     if (u,v) in seen: 
      rad=seen.get((u,v)) 
      rad=(rad+np.sign(rad)*0.1)*-1 
     alpha=0.5 
     color='k' 

     e = FancyArrowPatch(n1.center,n2.center,patchA=n1,patchB=n2, 
          arrowstyle='-|>', 
          connectionstyle='arc3,rad=%s'%rad, 
          mutation_scale=10.0, 
          lw=2, 
          alpha=alpha, 
          color=color) 
     seen[(u,v)]=rad 
     ax.add_patch(e) 

    return e 


#======================================================== 

def animate(i): 
    startTime = time.time() 
    """perform animation step""" 
    global mainGraph, nodeToCoordinate_dict, label_coordinatePositions    

    mainGraph.add_node(str(i%20)+","+str(i/20), pos = (i%20,i/20)) 
    if not (i%20 == 0): 
     mainGraph.add_edge(str(i%20-1)+","+str(i/20), str(i%20)+","+str(i/20))   
     prevNode_coordinate = nodeToCoordinate_dict[str(i%20-1)+","+str(i/20)] 

     mainGraph[str(i%20-1)+","+str(i/20)][str(i%20)+","+str(i/20)]['p'] = 1.0 
    #END IF  
    nodeToCoordinate_dict[str(i%20)+","+str(i/20)] = (i%20,i/20)        
    ax=plt.gca() 
    draw_network(mainGraph,nodeToCoordinate_dict,ax) 
    ax.autoscale() 
    plt.axis('equal') 
    plt.axis('off')   
    print("time Elapsed = ", time.time()-startTime) 
    return None #mainGraph 

#==================================================== 

ani = animation.FuncAnimation(fig, animate, frames= 60,interval=1000) 
plt.show() 
+0

對不起 - 當我複製並粘貼這個,我得到一個圖表顯示單個節點,然後很多關鍵錯誤。 – Joel

+0

@Joel這很奇怪,我將上面的代碼複製到一個新的,孤立的腳本中,並按預期運行。你有需要的進口嗎?也許更新的networkx和matplotlib。另外,請粘貼最相關的錯誤消息,我可能會弄清楚你的問題是什麼 –

回答

0

我想我想通了。使用「matplotlib.patches導入FancyArrowPatch,Circle」的函數正在減慢它的速度。這是「draw_network」功能。

我嘗試用簡單的代碼(nx.draw(mainGraph,nodeToCoordinate_dict))替換繪圖代碼,並將時間間隔縮短爲100(0.1秒)。像魅力一樣工作

現在,我只需要想出一個加速曲線邊緣圖形的方法。