Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Animate drawing networkx edges

I have a networkx spring layout that represents a network topology Key nodes are color as red and the other are blue The routes to the key nodes edges are indicated with dashes How can I animate the drawing the networkx edges with a specified time interval?

#!/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')
like image 844
user1772523 Avatar asked Nov 03 '22 12:11

user1772523


1 Answers

Here what I did, you can use plt.figure() to get the instance of the figure and glue that into the canvas, then add the canvas to the panel using e.g., 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()
like image 92
Sohraab Avatar answered Nov 11 '22 13:11

Sohraab