2014-04-20 26 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