胡海华分享 http://blog.sciencenet.cn/u/jgshuhaihua

博文

NetworkX:关于边的权重及其画图

已有 40953 次阅读 2010-10-18 17:03 |个人分类:NetworkX学习笔记|系统分类:科研笔记

这两天因为有个想法,想用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作为边的宽度来画图,效果如下:
nx.draw_networkx_edges(G,pos,width=edgewidth) #奇怪的是:edgewidth应该是一个列表,为什么可以直接拿来用呢?Python怎么判断哪个边用的是哪个权重值?
nx.draw_networkx_nodes(G,pos)
plt.show()

PS:后来发现这样写代码,如果节点比较多的时候会比较慢,还是把前面的句子拆开来写



https://wap.sciencenet.cn/blog-243747-374619.html

上一篇:NetworkX实现2:超大网络数据处理变通
下一篇:“我爸是李刚”事件中的某令人心寒的细节
收藏 IP: .*| 热度|

2 唐常杰 杨华磊

发表评论 评论 (2 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-5-20 04:08

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部