如果您的 csv 文件很大,我建议您将 pandas 用于任务的 I/O 部分。 networkx 有一个与pandas 交互的有用方法,称为from_pandas_dataframe。假设您的数据是上述格式的 csv,则此命令应该适合您:
df = pd.read_csv('path/to/file.csv', columns=['node1', 'node2', 'weight'])
但为了演示,我将在您的要求内使用 10 个随机边(您无需导入 numpy,我只是将其用于随机数生成):
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))
上一个块中的所有内容都应生成与您的pd.read_csv 命令相同的内容。导致这个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
使用from_pandas_dataframe 初始化MultiGraph。这假设您将有多个边连接到一个节点(OP 中未指定)。要使用此方法,您必须对convert_matrix.py 文件中的networkx 源代码进行简单更改,实现here(这是一个简单的错误)。
MG = nx.from_pandas_dataframe(df,
'node1',
'node2',
edge_attr='weight',
create_using=nx.MultiGraph()
)
这会生成您的 MultiGraph,您可以使用 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)
详细说明:
positions 是一个字典,其中每个节点都是一个键,值是图上的一个位置。我将在下面描述我们为什么存储positions。通用draw 将绘制您的MultiGraph 实例MG,其节点位于指定的positions。但是,如您所见,边缘的宽度都相同:
但是您拥有添加权重所需的一切。首先将权重放入名为weights 的列表中。使用edges 遍历每个边(使用列表理解),我们可以提取权重。我选择乘以5,因为它看起来最干净:
weights = [w[2]['weight']*5 for w in MG.edges(data=True)]
最后我们将使用draw_networkx_edges,它只绘制图形的边缘(没有节点)。由于我们拥有节点的positions,并且我们设置了hold=True,因此我们可以在之前的可视化之上绘制加权边缘。
nx.draw_networkx_edges(MG, pos=positions, width=weights) #width can be array of floats
您可以看到节点(14, 13) 具有来自DataFrame df(除了(13,13))的最重线和最大值。