NetworkX

複雑ネットワークを解析するためのグラフアルゴリズムなどをまとめたPythonのパッケージNetworkXを使ってみた.
とりあえずNewmanのサイトからとってこれる,空手クラブのネットワークデータを読み込んで,Girvan-Newman algorithmにより,グラフがコミュニティに分かれていく様子を描画するプログラムを作ってみた.

import networkx as NX
import networkx.readwrite.gml as NRG
import networkx.centrality as NC
import pylab as P

def updateGraph(G):
  ebc = NC.edge_betweenness(G)
  max = 0
  medge = None
  for k , v in ebc.iteritems():
    if max < v :
      medge , max = k , v 
  G.delete_edge(medge)
  return G

def drawGraph(G ,pos, output):
  NX.draw(G ,pos)
  P.savefig(output)
  P.draw()
  P.close()

G = NRG.read_gml("karate.gml")
eNum = G.number_of_edges()
pos = NX.spring_layout(G)
for i in range(eNum):
  output = "img/karate%(id)02d.png" % {"id": i}
  drawGraph(G , pos,output)
  updateGraph(G)

生成したpngファイルをimagemagickでアニメーションgifにしたもの
http://www.stat.t.u-tokyo.ac.jp/~tsubosaka/img/karate.gif