Jeśli masz dużą csv polecam korzystania pandas
dla części I/O Twoje zadanie. networkx
ma przydatną metodę do interfejsu z pandas
o nazwie from_pandas_dataframe
. Zakładając, że dane są w formacie csv w ty podanej powyżej, to polecenie powinno pracować dla Ciebie:
df = pd.read_csv('path/to/file.csv', columns=['node1', 'node2', 'weight'])
Ale do demonstracji użyję 10 losowych krawędzie wewnątrz wymagań (nie trzeba będzie importować numpy
ja tylko go używać do generowania liczb losowych):
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))
Wszystko w poprzednim bloku powinien wygenerować takie same jak polecenia pd.read_csv
. Otrzymany w ten 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
Zastosowanie from_pandas_dataframe
zainicjować MultiGraph
. Zakłada to, że będziesz mieć wiele krawędzi łączących się z jednym węzłem (nieokreślonym w OP). Aby użyć tej metody, będziesz musiał dokonać łatwej zmiany w kodzie źródłowym networkx
w pliku convert_matrix.py
, zaimplementowanym here (był to prosty błąd).
MG = nx.from_pandas_dataframe(df,
'node1',
'node2',
edge_attr='weight',
create_using=nx.MultiGraph()
)
To generuje swój multigraf można wizualizować to wykorzystując 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)
W szczegółach: positions
jest słownikiem, gdzie każdy węzeł jest kluczem, a wartość jest pozycja na wykresie.Opiszę, dlaczego poniżej przechowujemy positions
. Generic draw
narysuje instancję MultiGraph MG
z węzłami o podanej positions
. Jednak, jak widać, krawędzie mają taką samą szerokość:

Ale masz wszystko, czego potrzebujesz, aby dodać ciężary. Najpierw sprawdź wagę na liście o nazwie weights
. Iterowanie (ze zrozumieniem listy) przez każdą krawędź z edges
, możemy wyodrębnić wagi. Wybrałem pomnożyć przez 5
bo wyglądało to najczystsze:
weights = [w[2]['weight']*5 for w in MG.edges(data=True)]
koniec użyjemy draw_networkx_edges
, która tylko rysuje krawędzie grafu (bez węzłów). Ponieważ mamy węzły z positions
i ustawiamy hold=True
, możemy rysować ważone krawędzie tuż nad naszą poprzednią wizualizacją.
nx.draw_networkx_edges(MG, pos=positions, width=weights) #width can be array of floats

Można zobaczyć węzeł (14, 13)
ma najcięższe linię i największą wartość z DataFrame df
(oprócz (13,13)
).
można użyć ' sudo apt-get inst wszystkie graphviz' z twojego terminala, jeśli ** dot ** binary nie istnieje w twoim systemie –
@ Stefani Dzięki .. !! Mój wykres jest nie przekierowany, Jak mogę usunąć trasę. – user1659936
@ user1659936 Serdecznie zapraszamy, musisz dodać ** dir = none ** podczas budowy, więc proszę zastąpić linię: 's + = '->' + j + '[etykieta ="' + str (G [i ] [j]) + '", penwidth =' + str (waga) + ', kolor = czarny]'' od 's + = '->' + j + '[dir = none, label ="' + str (G [i] [j]) + '", penwidth =' + str (waga) + ', kolor = czarny]'' aby usunąć kierunek –