Wenn Sie eine große csv haben würde ich empfehlen die Verwendung von pandas
für den I/O-Teil deine Aufgabe. networkx
hat eine nützliche Methode zur Verbindung mit pandas
namens from_pandas_dataframe
. Angenommen, Ihre Daten in einer CSV im Format Sie oben angegeben, soll dieser Befehl für Sie arbeitet:
df = pd.read_csv('path/to/file.csv', columns=['node1', 'node2', 'weight'])
Aber zur Demonstration werde ich 10 zufällige Kanten verwendet innerhalb Ihrer Anforderungen (Sie werden nicht müssen numpy
importieren , ich verwende es nur für Erzeugung von Zufallszahlen):
import matplotlib as plt
import networkx as nx
import pandas as pd
#Generate Random edges and weights
import numpy as np
np.random.seed(0) # for reproducibility
w = np.random.rand(10) # weights 0-1
node1 = np.random.randint(10,19, (10)) # I used 10-19 for demo
node2 = np.random.randint(10,19, (10))
df = pd.DataFrame({'node1': node1, 'node2': node2, 'weight': w}, index=range(10))
Alles im vorhergehenden Satz sollte die gleiche wie Ihre pd.read_csv
Befehl erzeugen. Resultierende in diesem Datenrahmen, df
:
node1 node2 weight
0 16 13 0.548814
1 17 15 0.715189
2 17 10 0.602763
3 18 12 0.544883
4 11 13 0.423655
5 15 18 0.645894
6 18 11 0.437587
7 14 13 0.891773
8 13 13 0.963663
9 10 13 0.383442
Verwenden from_pandas_dataframe
MultiGraph
zu initialisieren. Dies setzt voraus, dass Sie mehrere Kanten haben, die sich mit einem Knoten verbinden (nicht in OP angegeben). Um diese Methode zu verwenden, müssen Sie eine einfache Änderung in networkx
Quellcode in der convert_matrix.py
Datei vornehmen, implementiert here (es war ein einfacher Fehler).
positions = nx.spring_layout(MG) # saves the positions of the nodes on the visualization
# pass positions and set hold=True
nx.draw(MG, pos=positions, hold=True, with_labels=True, node_size=1000, font_size=16)
Im Detail: positions
ist ein Wörterbuch, in dem jeder Knoten ein Schlüssel ist, und der Wert eine Position auf dem Diagramm
MG = nx.from_pandas_dataframe(df,
'node1',
'node2',
edge_attr='weight',
create_using=nx.MultiGraph()
)
Dies erzeugt Ihr Multigraphen, können Sie es draw
visualisieren nutzen.Ich werde beschreiben, warum wir positions
unten speichern. Das generische Objekt draw
zeichnet Ihre MultiGraph-Instanz MG
mit den Knoten unter der angegebenen Nummer positions
. Wie Sie jedoch sehen können, sind die Kanten alle gleich breit:

Aber Sie haben alles, was Sie brauchen, um die Gewichte hinzuzufügen. Holen Sie zuerst die Gewichte in eine Liste mit dem Namen weights
. Iterieren (mit Listenverständnis) durch jede Kante mit edges
, können wir die Gewichte extrahieren. Ich wählte von 5
zu multiplizieren, weil es die sauberste sah:
weights = [w[2]['weight']*5 for w in MG.edges(data=True)]
Schließlich werden wir draw_networkx_edges
verwenden, die nur die Kanten des Graphen zeichnet (keine Knoten). Da wir die positions
der Knoten haben, und wir setzen hold=True
, können wir gewichtete Kanten direkt über unserer vorherigen Visualisierung zeichnen.
nx.draw_networkx_edges(MG, pos=positions, width=weights) #width can be array of floats

Sie Knoten sehen (14, 13)
hat die schwerste Linie und den größten Wert aus dem Datenrahmen df
(neben dem (13,13)
).
können Sie ' sudo apt-get inst alle graphviz' von Ihrem Terminal, wenn ** dot ** binary nicht auf Ihrem System vorhanden ist –
@ Stefani Danke .. !! Mein Diagramm ist ungerichtet. Wie kann ich die Anweisungen entfernen? – user1659936
@ user1659936 Gern geschehen, du musst ** dir = none ** während der Bauphase hinzufügen, also ersetze bitte die Zeile: 's + = '->' + j + '[label =' '+ str (G [i ] [j]) + '", penwidth =' + str (gewicht) + ', color = schwarz]'' durch 's + = '->' + j + '[dir = keine, label ="' + str (G [i] [j]) + '", penwidth =' + str (gewicht) + ', color = schwarz]'" um die Richtung zu entfernen –