2013-07-07 14 views
8

Próbuję reprezentować graficznie niektóre wykresy i muszę zgrupować w klastrach niektóre węzły, które mają wspólną charakterystykę.Węzły grupy w klastrach przy użyciu NetworkX

Używam NetworkX i muszę zrobić coś podobnego na wykresie z this tutorial, ze slajdu 44, po lewej stronie.

Chcę narysować linię ograniczającą wokół każdego klastra. Mój obecny kod wygląda następująco:

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() 

Chciałbym znaleźć przykład i zobaczyć, jak używać networkx do grupowania wykresu.

Odpowiedz

3

Nie jestem pewien, jakie jest twoje pytanie. Myślę, że pytasz „jak mogę NetworkX umieścić niektóre węzły blisko siebie”

Zanim przejdziemy do odpowiedzi, dokumentacja rysunek dla NetworkX jest tutaj: http://networkx.lanl.gov/reference/drawing.html

Tak, że figura pytasz około ma 4 różne społeczności, które są skupione w oparciu o wiele krawędzi w obrębie każdej społeczności i nie wiele na zewnątrz.

Jeśli nie chcesz włożyć w to wiele wysiłku, spring_layout jest często dobry do łączenia ze sobą ściśle powiązanych społeczności. Podstawowy algorytm spring_layout działa tak, jakby krawędzie były sprężynami (i odpychają węzły). Tak wiele krawędzi utrzymuje blisko siebie węzły. Zauważ, że inicjalizuje pozycje losowo, więc za każdym razem otrzymasz inny wynik.

Najprostszym sposobem, aby to zrobić, to po prostu

nx.draw_spring(G) 

Ale może chcesz więcej. Jeśli chcesz, możesz naprawić pozycję każdego węzła. Zdefiniuj dykt, zwykle nazywany pos.

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

gdzie xcoord i ycoord są współrzędnymi, w których węzeł ma być.

Następnie wystarczy zrobić draw_networkx (G, pos = pos)

to często dużo wysiłku. Więc czasami po prostu powiedzieć, że niektóre z nich mają być w określonych miejscach, a niech NetworkX zrobić reszta

Definiowanie fixedpos na kilka węzłów, a następnie uruchomić spring_layout informując go, co węzły są stałe i nadając mu fixedpos jako początkowe pozycje. Wtedy będzie trzymać te ustalone i dopasować wszystko dookoła.

Oto kod generujący sieć, która ma 4 całkowicie połączone części i kilka innych krawędzi między nimi. (w rzeczywistości generuje kompletną sieć, a następnie usuwa wszystkie oprócz kilku krawędzi między tymi częściami). Następnie rysuje go z prostym układem sprężyn. Następnie naprawia 4 z nich w rogach kwadratu i umieszcza pozostałe węzły wokół tych ustalonych pozycji.

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() 

Można również określić wagi do krawędzi, przechodzą wagi do spring_layout i większe ciężary pokaże go trzymać bliżej siebie odpowiednie węzły. Kiedy już zidentyfikujesz swoje społeczności, zwiększ wagę w społecznościach/klastrach, jeśli to konieczne, aby utrzymać je blisko siebie.

Należy pamiętać, że można również określić kolor każdego węzła, więc można łatwo określić kolor dla każdej społeczności/klastra.

Jeśli chcesz narysować krzywe wokół każdego z tych klastrów, będziesz musiał to zrobić przez matplotlib.

Powiązane problemy