2016-04-07 10 views
0

Ich habe versucht, ein Netzwerkdiagramm mit NetzwerkX zu zeichnen, aber war told, dass diese Bibliothek nicht für den Zweck bestimmt ist, für den ich es verwenden möchte.Modellieren Sie ein ungerichtetes Diagramm in Python

So die ausgefallene Frage oben verlinkten zusammenfasst, ich mit den Daten anfangen möchte ich mit der eigentlichen Frage plotten und gehen:

graph = { 
    '1': ['2', '3', '4'], 
    '2': ['5','11','12','13','14','15'], 
    '3' : ['6','7','66','77'], 
    '5': ['6', '8','66','77'], 
    '4': ['7','66','77'], 
    '7': ['9', '10'] 
} 

diese Daten als defaultdict (Liste) in der Erwägung, das linke Teil ist Der Schlüssel und die Liste der rechten Seite ist eine Liste von Werten für diesen Schlüssel. Was ich erreichen möchte, ist ein Diagramm, ähnlich einem Netzwerk-Diagramm zeichnen here: Je mehr Kanten, desto größer die Knoten, beschriften die Knoten, etc.

Allerdings ist der Unterschied, dass ich die Schlüssel verbinden möchte, mit den entsprechenden Werten (1 mit 2, 1 mit 3, 1 mit 4) aber nicht die Schlüssel miteinander (nicht 1 mit 2 mit 3 mit 5 mit 4 mit 7).

Stellen Sie sich die Daten als Server und Clients vor. Die Schlüssel sind die Server und die Werte sind die Clients. Die Server (Schlüssel) sind nicht direkt miteinander verbunden, sie teilen nur (manchmal) dieselben Clients. Im obigen Beispiel sind Server 3 und Server 5 beide mit den Clients 6, 66 und 77 verbunden. Dies ist auch der Grund, warum die Clients (Werte) nicht miteinander verbunden werden sollten.

Ich war hoffentlich auf meine Frage klar ^^

Dank machen!

+0

Nur um sicherzustellen, dass ich verstehen - der Graph zwei Einheiten 2 benannt haben, aber man ist ein „Server“ und man ist ein " Kunde ", richtig? – Elisha

+0

Warum haben Sie die gleiche Frage noch einmal gestellt? Aktualisieren Sie Ihre ursprüngliche Frage mit diesen Informationen. – mfitzp

+0

@ Elisha: Ja, du hast Recht. @ Mfitzp: Ich wusste nicht, dass ich den Titel einer Frage ändern kann :( – user1252280

Antwort

2

Das Problem ist, dass Sie versuchen, die gleichen IDs für Ihre Server und Clients zu verwenden. NetworkX hat keine Möglichkeit zu wissen, ob sich 2 auf einen Client bezieht (der verbunden sein sollte) oder auf einen Server (der das nicht sollte). Um das zu tun, was Sie hier beschreiben, müssen Sie nur eine eindeutige ID für die Server erstellen. Zum Beispiel:

import networkx 

graph = { 
    '1': ['2', '3', '4'], 
    '2': ['5','11','12','13','14','15'], 
    '3': ['6','7','66','77'], 
    '5': ['6', '8','66','77'], 
    '4': ['7','66','77'], 
    '7': ['9', '10'] 
} 

g = networkx.Graph() 

for k, vs in graph.items(): 
    server_id = 'server_%s' % k 

    for v in vs: 
     g.add_edge(server_id,v) 

networkx.draw_spring(g) 

Dies erzeugt die folgende Ausgabe:

NetworkX plot

Um die Größe des Knotens durch die Anzahl der Kanten zu ändern, müssen Sie die Größe berechnen und zu draw_spring passieren. Um die Anzahl der Kanten für einen bestimmten Knoten zu erhalten, können Sie g.edges(node) z.

node_sizes = [150*len(g.edges(n)) for n in g.nodes()] 
networkx.draw_spring(g, node_size=node_sizes) 

Welche sollten Sie geben die folgenden:

enter image description here

+0

Vielen Dank @mfitzp: Das ist genau das, was ich gesucht habe! Entschuldigung für die Verwirrung mit den "Doppel-Posts", die ich nicht kannte , dass auch der Titel einer Frage nachträglich geändert werden kann, zwei Dinge, bevor ich sie als richtige Antwort schließlich bezeichne: Ich musste am Ende eine plt.show() hinzufügen, um die Figur tatsächlich zu zeigen, und zweitens: Ist das möglich? Knotgröße mit "draw_spring" entsprechend der Anzahl der Kanten anpassen? – user1252280

+0

@ user1252280 Kein Problem! Ich habe die Antwort mit Größe Knoten basierend auf der Anzahl der Kanten aktualisiert. Die 'plt.show() 'wird nur benötigt, wenn Sie eines der interaktiven Backends für' matplotlib' verwenden, also habe ich es weggelassen. Sie brauchen es beispielsweise nicht, wenn Sie die Figur speichern ('plt.gcf(). Savefig()') oder das Jupyter-Notebook verwenden. – mfitzp

+0

Ehrfürchtig. Danke für deine letzten Anpassungen :) – user1252280

Verwandte Themen