Networkx to Draw graph

使用Python的Networkx和matplotlib两个库可以画出由边和节点组成的图,支持节点,边的多项属性的设置。 包括颜色,标签,形状,边的宽度等等。

图的构建和基本使用

使用下面两条语句作为程序开始导入的库语句。

import networkx as nx
import matplotlib as plt

使用Networkx的库建立初始化一个图:

G = nx.Graph()

添加节点。nodename可以为字符串,也可以为一个整型。

G.add_node(nodename)

添加一个由节点组成的列表。nodes_list为一系列节点组成的一个节点列表。

G.add_nodes_from(nodes_list)

添加边。node1,node2为节点名字.

G.add_edge(node1, node2)
e = (node1, node2)
G.add_edge(*e) #unpack edge tuple*

添加一个边的列表,edges_list为一系列边组成的一个列表

G.add_edges_from(edges_list)

获得图G的节点总数

G.number_of_nodes()

获得图G的边总数

G.number_of_edges()

获得图G的所有节点的一个列表

G.nodes()

获得图G所有边的一个列表

G.edges()

为图,节点或者边添加属性,可以直接以字典的方式操作图的节点和边,而且它基本就是以字典的方式存储这些属性的。 >G.graph[‘attr_name’] = attr_value
>G.node[nodename][‘attr_name’] = attr_value
>G.edge[node1][node2][‘attr_name’] = attr_value

例子:

G.graph['title'] = 'cloudaice' #给图G添加一个title属性,值为'cloudaice'
G.node[1]['means'] = 'grass' #给图G的节点1添加一个means的属性,值为'grass'
G.edge[1][2]['len'] = 2 #给图G的边(1,2)添加一个len的属性,值为2

注意:这里添加属性的作用仅仅在于方便自己的使用,不要把这里的属性名字和后面的画图时候的属性联系起来

获得和node1相邻的所有节点

G.neighbors(node1)

迭代访问图G的所有的边,根据上面的介绍,我们可以使用G.edges()获得图G的所有的边的一个列表,然后迭代访问, 但是对于比较大的图,它的边会非常多,这里提供一种迭代器访问的方法:

for edge in G.adjacency_iter():
    print edge

更多使用方法可以参考Networkx的官方文档

画图生成图片

方法:

 nx.draw_networkx(G, pos, **kwds)

pos表示布局方式,常见的有以下几种布局方式:

具体获得方法:

pos = nx.circular_layout(G)
pos = nx.random_layout(G)
pos = nx.shell_layout(G)
pos = nx.spring_layout(G)
pos = nx.spectral_layout(G)

参数列表:

显示图片:

nx.draw(G, pos)
plt.show()

保存图片:

nx.draw(G, pos)
plt.savefig('simple.png')

这里的nx.draw()和nx.draw_networkx()里面使用的参数基本是一样的,只是draw_networkx()画出来的图片带坐标,这只是我试验的结果,不保证绝对正确
更多具体内容可以阅读官方文档

总结

networkx库作为Python的一个强大的图处理库。基本可以处理关于图的所有建模问题,再加上使用matplotlib库对图进行可视化,操作起来非常好用,不过windows用户在安装这两个库的时候可能需要一些额外的扩展包,安装的时候注意一下就可以了。

Xiang Chao 08 April 2013
blog comments powered by Disqus
Fork me on GitHub