【问题标题】:Animate drawing networkx edges动画绘制networkx边缘
【发布时间】:2012-10-24 18:18:02
【问题描述】:

我有一个代表网络拓扑的 networkx spring 布局 关键节点颜色为红色,其他为蓝色 到关键节点边缘的路线用破折号表示 如何以指定的时间间隔为绘制 networkx 边缘设置动画?

#!/usr/bin/env python

import matplotlib.pyplot as plt
import networkx as nx
import matplotlib as mpl

G=nx.Graph()

G.add_edge('a','b',weight=0.6)
G.add_edge('a','c',weight=0.2)
G.add_edge('c','d',weight=0.1)
G.add_edge('c','e',weight=0.7)
G.add_edge('c','f',weight=0.9)
G.add_edge('a','d',weight=0.3)

elarge=[(u,v) for (u,v,d) in G.edges(data=True) if d['weight'] >0.5]
esmall=[(u,v) for (u,v,d) in G.edges(data=True) if d['weight'] <=0.5]

#specify an initial position that is not random e.g. use a circular layout
pos=nx.circular_layout(G)
pos=nx.spring_layout(G,dim=2,pos=pos) # positions for all nodes
#pos=nx.spring_layout(G) # positions for all nodes
print "Graph xy positions"
print  pos

# nodes
nx.draw_networkx_nodes(G,pos,node_size=700)

# edges
nx.draw_networkx_edges(G,pos,edgelist=elarge,
                width=6)
nx.draw_networkx_edges(G,pos,edgelist=esmall,
                width=6,alpha=0.5,edge_color='b',style='dashed')

# labels
nx.draw_networkx_labels(G,pos,font_size=20,font_family='sans-serif')

plt.xlim(-0.05,1.05)
plt.ylim(-0.05,1.05)
plt.axis('off')

【问题讨论】:

    标签: python matplotlib networkx


    【解决方案1】:

    试试animation module。还可以看到这个很棒的tutorialMatplotlib animate over an image

    【讨论】:

    • 我使用了matplotlib动画库animation.ArtistAnimation(fig, ims, interval=50, blit=True,repeat_delay=1000)
    • 这实际上只是一个仅链接的答案。
    【解决方案2】:

    这就是我所做的,您可以使用 plt.figure() 获取图形的实例并将其粘贴到画布中,然后使用例如 vbox 将画布添加到面板:

    import matplotlib.pyplot as plt
    import networkx as nx
    import wx
    from matplotlib.backends.backend_wxagg import \
    FigureCanvasWxAgg as FigCanvas, \
    NavigationToolbar2WxAgg as NavigationToolbar
    
    class NetworkFrame(wx.Frame):
    
    def __init__(self):
        wx.Frame.__init__(self, None, -1)
        self.panel = wx.Panel(self)
        self.fig = plt.figure()
        self.canvas = FigCanvas(self.panel, -1, self.fig)
        G=nx.house_graph()
    pos={0:(0,0),
        1:(1,0),
        2:(0,1),
        3:(1,1),
        4:(0.5,2.0)}
    
    nx.draw_networkx_nodes(G,pos,node_size=2000,nodelist=[4])
    nx.draw_networkx_nodes(G,pos,node_size=3000,nodelist=[0,1,2,3],node_color='b')
    nx.draw_networkx_edges(G,pos,alpha=0.5,width=6)
    plt.axis('off')
    self.vbox = wx.BoxSizer(wx.VERTICAL)
        self.vbox.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
        self.toolbar = NavigationToolbar(self.canvas)
        self.vbox.Add(self.toolbar, 0, wx.EXPAND)
        self.panel.SetSizer(self.vbox)
        self.vbox.Fit(self)
    
    
    #plt.savefig("house_with_colors.png") # save as png
    #plt.show() # display
    
    if __name__ == '__main__':
      app = wx.PySimpleApp()
      app.frame = NetworkFrame()
      app.frame.Show()
      app.MainLoop()
    

    【讨论】:

      【解决方案3】:

      试试这个

      def animate():
          tstart = time.time()                  
          nf = 100
          for i in np.arange(1,nf):
              #...
              #update plot code
              #...
              fig.canvas.draw()                 
      
              # stop execution of animate() untill the generators next() method is called
              yield True                        # continue animation
          print 'FPS:' , nf/(time.time()-tstart)
          raise SystemExit
      

      【讨论】:

        猜你喜欢
        • 2021-06-03
        • 1970-01-01
        • 1970-01-01
        • 2020-06-24
        • 2020-05-20
        • 2015-12-30
        • 2015-04-06
        • 1970-01-01
        • 2023-02-25
        相关资源
        最近更新 更多