手头帮别人使用Python处理有向权重网络,搜的不少关于NetworkX资料都是互相转载抄袭的,不想要的东西看了几十遍,想要的东西还得去官方文档里找。中间遇到不少坑,写在这。
可视化一般使用matplotlib.pyplot库。
import matplotlib.pyplot as plt …… nx.draw(G) #绘制网络图 plt.show() #以窗口形式展现,可以放大、保存等操作。注意该命令是非异步的,不关闭窗口是不会继续往下执行的 plt.savefig("ba.png") #当然也可以这样保存图片下面是nx.draw() 可选参数:
- `node_size`: 指定节点的尺寸大小(默认是300,单位未知,就是上图中那么大的点) - `node_color`: 指定节点的颜色 (默认是红色,可以用字符串简单标识颜色,例如'r'为红色,'b'为绿色等,具体可查看手册) - `node_shape`: 节点的形状(默认是圆形,用字符串'o'标识,具体可查看手册) - `alpha`: 透明度 (默认是1.0,不透明,0为完全透明) - `width`: 边的宽度 (默认为1.0) - `edge_color`: 边的颜色(默认为黑色) - `style`: 边的样式(默认为实现,可选: solid|dashed|dotted,dashdot) - `with_labels`: 节点是否带标签(默认为True) - `font_size`: 节点标签字体大小 (默认为12) - `font_color`: 节点标签字体颜色(默认为黑色)灵活运用上述参数,可以绘制不同样式的网络图形,例如:nx.draw(G,node_size = 30,with_labels = False) 是绘制节点尺寸为30、不带标签的网络图。
下面是绘图布局:
NetworkX在绘制网络图形方面提供了布局的功能,可以指定节点排列的形式。这些布局包括: circular_layout:节点在一个圆环上均匀分布 random_layout:节点随机分布 shell_layout:节点在同心圆上分布 spring_layout: 用Fruchterman-Reingold算法排列节点(这个算法我不了解,样子类似多中心放射状) spectral_layout:根据图的拉普拉斯特征向量排列节点?我也不是太明白 布局用pos参数指定,例如:nx.draw(G,pos = nx.circular_layout(G))。在上一篇笔记中,四个不同的模型分别是用四种布局绘制的,可以到那里去看一下效果,此处就不再重复写代码了。 另外,也可以单独为图中的每个节点指定一个位置(x、y坐标),不过比较复杂,我还没有这样做过。感兴趣的朋友可以看一下NetworkX文档中的一个例子:http://networkx.lanl.gov/examples/drawing/knuth_miles.html。
NetworkX提供了常用的图论经典算法,例如DFS、BFS、最短路、最小生成树、最大流等等,非常丰富,如果不做复杂网络,只作图论方面的工作,也可以应用NetworkX作为基本的开发包。具体的算法调用方法我就不一一介绍了,可以浏览NX的在线手册http://networkx.lanl.gov/reference/algorithms.html,对每个算法都提供了详细的帮助文档和示例。下面只给出一个最短路算法的例子:
path=nx.all_pairs_shortest_path(G) #调用多源最短路径算法,计算图G所有节点间的最短路径 print path[0][2] #输出节点0、2之间的最短路径序列: [0, 1, 2]
参考:
官方文档: http://networkx.readthedocs.io/en/latest/ 文档首页http://networkx.github.io/documentation/development/tutorial/index.html Tutorialhttp://networkx.github.io/documentation/development/reference/drawing.html 绘图说明http://networkx.github.io/documentation/development/reference/algorithms.html 内置算法说明其他博客: http://www.cnblogs.com/gispathfinder/p/5790949.html