这两天因为有个想法,想用NetworkX跑一跑看看情况,但是在权重上犯了糊涂。
NetworkX添加带有权重的边很简单,只需要以三个元素的元组(a, b, w)来表示就可以了,其中ab代表节点a和b——这两个元素合在一起就代表两个节点连接的边,w则代表权重。
我想生成一个BA网络,然后对每条边随机赋予边权重。生成BA网络很简单,一个命令就搞定。但是怎么往里面加权重呢?琢磨了半天才发现可以这样做:
G=nx.Graph()
for u, v in nx.barabasi_albert_graph(10,2,seed=1).edges():
G.add_edge(u,v,weight=random.uniform(0,0.4))
解决赋权重后,怎么提取权重做计算和画图呢?NetworkX提供了一个命令get_edge_data来获取其权重,但是是以字典的形式来表示的:{'weight': 0.3232300003}
我就用了个笨方法,把这个字典中的value值提取出来再来用:
pos=nx.spring_layout(G,iterations=20)
edgewidth=[]
for (u,v,d) in G.edges(data=True):
edgewidth.append(round(G.get_edge_data(u,v).values()[0]*20,2))
#这里因为权重赋值太小,生成图的话边会很细,而且不容易分辨,所以我乘以20,如果做计算的话,这个20得去掉
接下来我用这个edgewidth作为边的宽度来画图&