Gruppieren Sie Knoten in Clustern mit NetworkX

8

Ich versuche grafisch einige Graphen darzustellen, und ich muss in Cluster einige Knoten gruppieren, die gemeinsame Eigenschaften haben.

Ich verwende NetworkX, und ich muss etwas Ähnliches mit dem Graphen aus diesem Tutorial machen, von der Rutsche 44, linke Abbildung.

Ich möchte um jeden Cluster eine Begrenzungslinie zeichnen. Mein aktueller Code ist so:

%Vor%

Ich möchte ein Beispiel finden und sehen, wie ich NetworkX verwenden kann, um den Graphen zu clustern.

    
alinsoar 07.07.2013, 11:58
quelle

1 Antwort

3

Ich bin nicht sicher, was deine Frage ist. Ich denke du fragst "Wie bekomme ich Networkx um einige Knoten nahe beieinander zu setzen"

Bevor ich mit der Antwort anfange, ist die Zeichnungsdokumentation für networkx hier: Ссылка

Diese Figur, nach der Sie fragen, hat 4 verschiedene Gemeinschaften, die gruppiert sind, basierend auf vielen Kanten innerhalb jeder Gemeinschaft und nicht viele außerhalb.

Wenn du dich nicht anstrengen willst, ist spring_layout oft gut dafür geeignet, eng verbundene Gemeinschaften zusammenzubringen. Der grundlegende Algorithmus von spring_layout verhält sich so, als ob die Kanten Federn sind (und Knoten abstoßen). Viele Kanten halten Knoten nahe beieinander. Beachten Sie, dass es die Positionen zufällig initialisiert, so dass Sie jedes Mal eine andere Ausgabe erhalten.

Der einfachste Weg, dies zu tun, ist nur

%Vor%

Aber vielleicht willst du mehr. Wenn Sie möchten, können Sie die Position jedes einzelnen Knotens festlegen. Definieren Sie ein Diktat, normalerweise mit dem Namen pos.

%Vor%

Dabei sind xcoord und ycoord die Koordinaten, an denen der Knoten sein soll.

Dann tu es einfach     draw_networkx (G, pos = pos)

Das ist oft eine Menge Aufwand. Manchmal sagst du einfach, dass einige von ihnen an bestimmten Orten sein müssen, und networkx erledigt den Rest.

Definieren Sie fixedpos für einige Knoten und dann ausführen     Frühling_Layout sagen Sie ihm, welche Knoten fest sind und geben Sie fixedpos als Ausgangspositionen. Dann wird es die fixen halten und alles andere passen.

Hier ist ein Code, der ein Netzwerk erzeugt, das 4 vollständig verbundene Teile und einige andere Kanten zwischen ihnen hat. (Tatsächlich erzeugt es ein komplettes Netzwerk und löscht dann alle bis auf wenige Kanten zwischen diesen Teilen). Dann zeichnet es mit einem einfachen Federlayout. Dann fixiert es 4 von ihnen an den Ecken eines Quadrats und platziert die anderen Knoten um diese festen Positionen.

%Vor%

Sie können auch Gewichtungen für die Kanten angeben, die Gewichtungen an spring_layout übergeben, und größere Gewichtungen weisen darauf hin, dass die entsprechenden Knoten näher beieinander liegen. Sobald Sie Ihre Communities identifiziert haben, erhöhen Sie ggf. die Gewichtung innerhalb der Communities / Cluster, um sie dicht beieinander zu halten.

Beachten Sie, dass Sie auch die Farbe für jeden Knoten angeben können. Daher ist es einfach, die Farbe für jede Community / jeden Cluster anzugeben.

Wenn Sie dann Kurven um jeden dieser Cluster zeichnen möchten, müssen Sie dies über matplotlib tun.

    
Joel 11.12.2014 05:26
quelle

Tags und Links