import graph_tool.all as gt
import numpy as np
# these methods give as output a property map of positions (i.e. the layout for the visualization)
def random(self):
# creating visualisation with Random layout
pos = gt.random_layout(self.glc)
coloured_drawing(self, pos, 'Random_Advanced', 'heptagon')
# gt.graph_draw(self.glc, pos=pos, output="/CORIA/coria-frontend/pics/"+self.graph_name+"_RANDOM.png")
return pos
def frucht(self):
# creating visualisation with Fruchtermann-Reingold layout
pos = gt.fruchterman_reingold_layout(self.glc, r=1.8, n_iter=36)
coloured_drawing(self, pos, 'Fruchterman_Reingold_Advanced', 'hexagon')
# gt.graph_draw(self.glc, pos=pos, output="/CORIA/coria-frontend/pics/"+self.graph_name+"_FRUCHT.png")
return pos
def arf(self):
# creating visualisation with ARF layout
pos = gt.arf_layout(self.glc, max_iter=1000)
# gt.graph_draw(self.glc, pos=pos, output="/CORIA/coria-frontend/pics/"+self.graph_name+"_ARF.png")
return pos
def radial(self):
# creating visualisation with Radial Tree layout
if not hasattr(self.g.vp, 'betweenness'):
for i in range(0,self.g.num_vertices()):
max_asn = self.redis.zrange(self.metric_prefix+'betweenness_centrality_(gt)',-i-1,-i-1,withscores=False,score_cast_func=float)[0]
max_vertex = gt.find_vertex(self.glc, self.label_map, max_asn)
#test whether vertex exists and vertex is in largest component
if max_vertex != None:
break #end loop
pos = gt.radial_tree_layout(self.glc, root=max_vertex[0], weighted=True)
else:
if hasattr(self.g.vp, 'eigenvector'):
temp = self.glc.vp.eigenvector
else:
temp = self.glc.vp.betweenness
max_vertex = gt.find_vertex(self.glc, self.glc.vp.betweenness, np.max(self.glc.vp.betweenness.a))
pos = gt.radial_tree_layout(self.glc, root=max_vertex[0], rel_order=temp, weighted=True, node_weight=temp)
#gt.graph_draw(self.glc, pos=pos, output="/CORIA/coria-frontend/pics/"+self.graph_name+"_RADIAL.png")
coloured_drawing(self, pos, 'Radial_Advanced_2')
return pos
def sfdp(self):
# creating visualisation with SFDP layout
if not hasattr(self.g.vp, 'sfdp'):
self.g.vp.sfdp = gt.sfdp_layout(self.glc)
pos = self.g.vp.sfdp
# test colouring of graph
coloured_drawing(self, pos, 'SFDP_Advanced', 'octagon')
return pos
def coloured_drawing(self, pos, name, shape="circle"):
if not hasattr(self, 'eigc'):
# caching to reduce calculation time overall
# define metric property maps for colouring
eigc = self.g.vp.eigenvector.copy()
ebwc = self.g.ep.betweenness.copy()
# right-size property maps
eigc.a = np.sqrt(eigc.a)
eigc = gt.prop_to_size(eigc)
ebwc = gt.prop_to_size(ebwc)
#vsize = eigc.copy() # obtain property map for size of vertices
eigc.a /= eigc.a.max() # normalization to 0-1
ebwc.a /= ebwc.a.max() # normalization to 0-1
# obtain maps for edges
eorder = ebwc.copy()
eorder.a *= -1
econtrol = self.g.new_edge_property("vector<double>")
for e in self.glc.edges():
d = np.sqrt(sum((pos[e.source()].a - pos[e.target()].a) ** 2)) / 3
econtrol[e] = [0.3,d,0.7,d]
# storing for later access
self.eigc = eigc
self.ebwc = ebwc
self.eorder = eorder
self.econtrol= econtrol
if not hasattr(self, 'vcolour'):
vcolour = self.g.new_vertex_property("vector<double>") # obtain colour map
for v in self.glc.vertices():
vcolour[v] = [self.eigc[v],self.eigc[v]/4.0,self.eigc[v]/6.0,(1.0+2.0*self.eigc[v])/3.0]
#vsize[v] = int(vsize[v])
# obtain maps for edges
ecolour = self.g.new_edge_property("vector<double>")
for e in self.glc.edges():
ecolour[e] = [self.ebwc[e]/8.0,self.ebwc[e]/2.0,self.ebwc[e],(1.0+2.0*self.ebwc[e])/4.0]
# storing for later access
self.vcolour = vcolour
self.ecolour = ecolour
gt.graph_draw(self.glc, pos=pos, vertex_shape=shape, vertex_fill_color=self.vcolour, vorder=self.eigc, edge_color=self.ecolour, eorder=self.eorder, edge_control_points=self.econtrol, output="/CORIA/coria-frontend/pics/"+self.graph_name+"_"+name+".png")
self.redis.sadd(self.layout_index_key, name)
def draw_deterioration(self, pos, name, shape="circle"):
excl = self.exclusion_map.copy()
if not hasattr(self, 'eigc'):
# caching to reduce calculation time overall
# define metric property maps for colouring
eigc = self.g.vp.eigenvector.copy()
ebwc = self.g.ep.betweenness.copy()
# right-size property maps
eigc.a = np.sqrt(eigc.a)
eigc = gt.prop_to_size(eigc)
ebwc = gt.prop_to_size(ebwc)
#vsize = eigc.copy() # obtain property map for size of vertices
eigc.a /= eigc.a.max() # normalization to 0-1
ebwc.a /= ebwc.a.max() # normalization to 0-1
# obtain maps for edges
eorder = ebwc.copy()
eorder.a *= -1
econtrol = self.g.new_edge_property("vector<double>")
for e in self.glc.edges():
d = np.sqrt(sum((pos[e.source()].a - pos[e.target()].a) ** 2)) / 3
econtrol[e] = [0.3,d,0.7,d]
# storing for later access
self.eigc = eigc
self.ebwc = ebwc
self.eorder = eorder
self.econtrol= econtrol
# graph without the excluded vertices (i.e. those that have value 0 in the exclusion map)
f = gt.GraphView(self.g, vfilt = excl)
# largest component of graph f
l = gt.label_largest_component(f)
vfcolour = self.g.new_vertex_property("vector<double>") # obtain colour map
vcolour = vfcolour.copy()
for v in self.g.vertices():
excl[v] *= l[v]
if excl[v] != 1:
vfcolour[v] = [0.0,0.0,0.0,0.01]
vcolour[v] = [0.0,0.0,0.0,0.05]
else:
vfcolour[v] = [self.eigc[v],self.eigc[v]/4.0,self.eigc[v]/6.0,(1.0+2.0*self.eigc[v])/3.0]
vcolour[v] = [self.eigc[v]/2.0,self.eigc[v]/3.0,self.eigc[v]/4.0,(2.0+1.0*self.eigc[v])/3.0]
#vsize[v] = int(vsize[v])
ecolour = self.g.new_edge_property("vector<double>")
for e in self.g.edges():
if excl[e.target()] != 1 or excl[e.source()] != 1:
ecolour[e] = [0.0,0.0,0.0,0.05]
else:
ecolour[e] = [self.ebwc[e]/8.0,self.ebwc[e]/2.0,self.ebwc[e],(1.0+2.0*self.ebwc[e])/4.0]
gt.graph_draw(self.g, pos=pos, vertex_shape=shape, vertex_color=vcolour, vertex_fill_color=vfcolour, vorder=self.eigc, edge_color=ecolour, eorder=self.eorder, edge_control_points=self.econtrol, output="/CORIA/coria-frontend/pics/"+self.graph_name+"_"+name+".png")
#self.redis.sadd(self.layout_index_key,name)
#self.redis.hset(self.percolation_prefix+self.layout_index_key,name,pct)