2013-07-07 28 views
8

グラフをグラフで表現しようとしていますが、クラスターでグループ化する必要があります。共通の特徴を持つノード。NetworkXを使用してクラスター内のグループ頂点をグループ化する

私はNetworkXを使用しています。左の図のスライド44のthis tutorialのグラフと同様のことをする必要があります。

各クラスタの周りに区切り線を描きたいと思います。私の現在のコードは、そのようなものです:

vec = self.colors 
    colors = (linspace(0,1, len (set (vec)))* 20 + 10) 
    nx.draw_circular(g, node_color=array([colors[x] for x in vec])) 
    show() 

私は例を見つけて、私は、グラフをクラスタ化するnetworkx使用する方法を見たいです。

答えて

3

あなたの質問は肯定的ではありません。私は答えに起動する前に、networkxの描画ドキュメントはここにあるあなたが「どのように私はいくつかのノードを入れてnetworkx得るのですか一緒に閉じて」求めている

を考える:http://networkx.lanl.gov/reference/drawing.html

あなたが求めているので、その数字およそ4つの異なるコミュニティがあり、それぞれのコミュニティ内に多くのエッジを持ち、多くの外部には存在しません。

spring_layoutは、しっかりと編み組んだコミュニティをまとめるのに適しています。 spring_layoutの基本的なアルゴリズムは、あたかもエッジがスプリングであるかのように動作します(ノードははじきます)。したがって、多くのエッジがノードを密接に保ちます。位置がランダムに初期化されるので、異なる出力が得られるたびに注意してください。

これを行うための最も簡単な方法は、ちょうど

nx.draw_spring(G) 

ですが、多分あなたはもっと欲しいです。必要に応じて、すべての単一ノードの位置を修正できます。通常はposというdictを定義します。

pos = {} 
for node in G.nodes_iter(): 
    pos[node] = (xcoord, ycoord). 

ここで、xcoordとycoordは、ノードを配置する座標です。

は、それからちょうど、多くの場合、多くの労力だ draw_networkx(G、POS = POS)

を行います。だから、時にはあなたはそれらのいくつかは、特定の場所にする必要がそれを教えてくれ、とnetworkx残り

は、少数のノードに対してfixedposを定義して、固定され、それがようfixedpos与えているかのノードにそれを伝える spring_layout を実行してみましょう最初の位置。それは固定され、それらの周りに他のものに収まるものを保持します。

ここでは、4つの完全に接続された部分とそれらの間にいくつかの他のエッジがあるネットワークを生成するいくつかのコードです。 (実際には完全なネットワークを生成し、これらの部分間のエッジを除くすべてを削除します)。単純なスプリングレイアウトで描画します。次に、それらのうちの4つを正方形の角に固定し、他のノードをその固定位置の周りに配置します。

import networkx as nx 
import random 
import pylab as py 
from math import floor 

G = nx.complete_graph(20) 

for edge in G.edges(): 
    if floor(edge[0]/5.)!=floor(edge[1]/5.): 
     if random.random()<0.95: 
      G.remove_edge(edge[0],edge[1]) 


nx.draw_spring(G) 
py.show() 


fixedpos = {1:(0,0), 6:(1,1), 11:(1,0), 16:(0,1)} 
pos = nx.spring_layout(G, fixed = fixedpos.keys(), pos = fixedpos) 

nx.draw_networkx(G, pos=pos) 

py.show() 

また、エッジに重みを指定spring_layoutする重みを渡すと、より大きな重みが互いに接近して対応するノードを保つためにそれを教えてくれますすることができます。したがって、コミュニティを特定したら、必要に応じてコミュニティ/クラスタ内の重みを増やして、それらを互いに近づけてください。

各ノードを作成する色を指定することもできますので、各コミュニティ/クラスタの色を指定することは簡単です。

これらの各クラスタの周りにカーブを描きたい場合は、matplotlibを使用してカーブを描く必要があります。

関連する問題