Se si dispone di un grande csv Mi consiglia di utilizzare pandas
per la parte di I/O di il tuo compito. networkx
ha un metodo utile per interfacciare con pandas
chiamato from_pandas_dataframe
. Supponendo che i vostri dati sono in un csv nel formato indicato in precedenza, questo comando dovrebbe funzionare per voi:
df = pd.read_csv('path/to/file.csv', columns=['node1', 'node2', 'weight'])
Ma per la dimostrazione userò 10 bordi casuali all'interno delle vostre esigenze (non sarà necessario importare numpy
, sto solo usando per la generazione di numeri casuali):
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))
Tutto nel blocco precedente dovrebbe generare lo stesso come il vostro comando pd.read_csv
. Con conseguente questo dataframe, 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
Usa from_pandas_dataframe
per inizializzare MultiGraph
. Ciò presuppone che si avranno più edge che si connettono a un nodo (non specificato in OP). Per utilizzare questo metodo, è necessario apportare una modifica semplice nel codice sorgente networkx
nel file convert_matrix.py
, implementato here (si trattava di un bug semplice).
MG = nx.from_pandas_dataframe(df,
'node1',
'node2',
edge_attr='weight',
create_using=nx.MultiGraph()
)
Questo genera la vostra multigrafo, è possibile visualizzarla utilizzando draw
:
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)
In dettaglio: positions
è un dizionario in cui ogni nodo è una chiave e il valore è una posizione sul grafico.Descriverò perché memorizziamo positions
di seguito. Il codice generico draw
disegna l'istanza MultiGraph MG
con i nodi allo positions
specificato. Tuttavia, come puoi vedere i bordi sono tutti della stessa larghezza:
Ma tu hai tutto il necessario per aggiungere i pesi. Per prima cosa prendi i pesi in una lista chiamata weights
. Iterando (con la comprensione delle liste) attraverso ogni spigolo con edges
, possiamo estrarre i pesi. Ho scelto di moltiplicare per 5
perché sembrava il più pulito:
weights = [w[2]['weight']*5 for w in MG.edges(data=True)]
Infine useremo draw_networkx_edges
, che attira solo i bordi del grafico (senza nodi). Dato che abbiamo il positions
dei nodi e abbiamo impostato hold=True
, possiamo disegnare bordi ponderati proprio sopra la nostra visualizzazione precedente.
nx.draw_networkx_edges(MG, pos=positions, width=weights) #width can be array of floats
Si può vedere nodo (14, 13)
ha la linea più pesante e il più grande valore dal dataframe df
(oltre al (13,13)
).
È possibile utilizzare ' sudo apt-get inst tutto graphviz' dal tuo terminale se ** punto ** binario non esiste sul tuo sistema –
@ Stefani Grazie .. !! Il mio grafico non è orientato, Come posso rimuovere le indicazioni. – user1659936
@ user1659936 Prego, è necessario aggiungere ** dir = none ** durante la costruzione, quindi si prega di sostituire la riga: 's + = '->' + j + '[label ="' + str (G [i ] [j]) + "", penwidth = '+ str (peso) +', color = black] ''di' s + =' -> '+ j +' [dir = none, label = "'+ str (G [i] [j]) + "", penwidth = '+ str (peso) +', color = black] ''per rimuovere la direzione –