在《运筹学》课堂上,我们学习过图与网络,当时用到R语言下的igraph包来计算和展示结果。Python下也有类似甚至更好的库: NetworkX。
安装命令如下
conda install networkx
引入约定为
importnetworkxasnx
1 图的绘制
无向图
无向图由点和边构成,其绘制思路为:①新建空图→②添加点→③添加边。
新建空的无向图
G=nx.Graph()
以后所有的信息都添加在无向图G上。
添加点:addnode和add_nodes_from
# 添加一个点
G.add_node(1)# 点的名字叫1
G.add_node('a')# 点的名字叫a
# 添加一组点
G.add_nodes_from([2,3,4])
虽然还没有讲到怎么展示这张图,但你可能想看看自己已经画了啥;所以我们剧透一下:输入nx.draw(G)看看吧。
添加边:add_edge和add_edges_from
# 添加一条边
G.add_edge(1,2)# 在1、2之间添加边
G.add_edge(1,'a')# 在1、a之间添加边
# 添加一组边
G.add_edges_from([(2,3),(3,4,),('a',3)])
# 添加边时自动生成点
G.add_edge(3,'b')# 此前没有添加过b点
# 添加圈
G.add_cycle(['b','c','d'])
# 注意这些命令都有color参数,将来会用到
移除点或边使用remove_*系列方法。
展示图
NetworkX可以结合matpltlib库来展示图,因此需要载入plt:
importmatplotlib.pyplotasplt
最常用的展示命令是 networkx.draw(),所有参数都是可选的。
nx.draw()
简单介绍一些可选参数,如
ax:画纸名
nodecolor/edgecolor/font_color:点、边、字颜色
nodeshape/nodesize:点的形状和大小
style:边的形状(solid/dashed/dotted/dashdot)
alpha:点和边的透明度
with_labels:点是否显示标签
arrows/arrowstyle/arrowsize:有向图的箭头设定
我们并列展示默认和自定义结果:
fig=plt.figure(figsize=(20,5))
ax1=plt.subplot(121)
nx.draw(G,ax=ax1)
ax2=plt.subplot(122)
nx.draw(G,a