私はあなたの質問が何であるか確信が持てません。「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 を定義し、spring_layout を実行して、どのノードが固定されているかを伝え、fixedpos を初期位置として指定します。次に、それらを固定して保持し、他のすべてを適合させます。
以下は、完全に接続された 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 を使用してそれを行う必要があります。