2014-04-20 22 views
3

我需要的视图(或绘制曲线)的分组顶点网络绘制网络和同一社区或分区

社区结构我有这样的:

import igraph 
from random import randint 

def _plot(g, membership=None): 
    layout = g.layout("kk") 
    visual_style = {} 
    visual_style["edge_color"] = "gray" 
    visual_style["vertex_size"] = 30 
    visual_style["layout"] = layout 
    visual_style["bbox"] = (1024, 768) 
    visual_style["margin"] = 40 
    for vertex in g.vs(): 
     vertex["label"] = vertex.index 
    if membership is not None: 
     colors = [] 
     for i in range(0, max(membership)+1): 
      colors.append('%06X' % randint(0, 0xFFFFFF)) 
     for vertex in g.vs(): 
      vertex["color"] = str('#') + colors[membership[vertex.index]] 
     visual_style["vertex_color"] = g.vs["color"] 
    igraph.plot(g, **visual_style) 

if __name__ == "__main__": 
    karate = igraph.Nexus.get("karate") 
    cl = karate.community_fastgreedy() 
    membership = cl.as_clustering().membership 
    _plot(karate, membership) 

但顶点传播。在另一个网络中,这个结果非常糟糕。

enter image description here

我想要的顶点由颜色相似的区域进行分组。

E.g:

enter image description here

回答

1

跨多个社区中删除的边缘上,在没有这些边缘计算的布局,然后使用它的原始图形。

+0

谢谢,我会试试看。 –

4

基于@的Gabor-csardi答案,我做了这个代码:

import igraph 
from random import randint 

def _plot(g, membership=None): 
    if membership is not None: 
     gcopy = g.copy() 
     edges = [] 
     edges_colors = [] 
     for edge in g.es(): 
      if membership[edge.tuple[0]] != membership[edge.tuple[1]]: 
       edges.append(edge) 
       edges_colors.append("gray") 
      else: 
       edges_colors.append("black") 
     gcopy.delete_edges(edges) 
     layout = gcopy.layout("kk") 
     g.es["color"] = edges_colors 
    else: 
     layout = g.layout("kk") 
     g.es["color"] = "gray" 
    visual_style = {} 
    visual_style["vertex_label_dist"] = 0 
    visual_style["vertex_shape"] = "circle" 
    visual_style["edge_color"] = g.es["color"] 
    # visual_style["bbox"] = (4000, 2500) 
    visual_style["vertex_size"] = 30 
    visual_style["layout"] = layout 
    visual_style["bbox"] = (1024, 768) 
    visual_style["margin"] = 40 
    visual_style["edge_label"] = g.es["weight"] 
    for vertex in g.vs(): 
     vertex["label"] = vertex.index 
    if membership is not None: 
     colors = [] 
     for i in range(0, max(membership)+1): 
      colors.append('%06X' % randint(0, 0xFFFFFF)) 
     for vertex in g.vs(): 
      vertex["color"] = str('#') + colors[membership[vertex.index]] 
     visual_style["vertex_color"] = g.vs["color"] 
    igraph.plot(g, **visual_style) 

if __name__ == "__main__": 
    g = igraph.Nexus.get("karate") 
    cl = g.community_fastgreedy() 
    membership = cl.as_clustering().membership 
    _plot(g, membership) 

结果:

enter image description here