NetworkX 笔记

    xiaoxiao2021-12-01  16

    手头帮别人使用Python处理有向权重网络,搜的不少关于NetworkX资料都是互相转载抄袭的,不想要的东西看了几十遍,想要的东西还得去官方文档里找。中间遇到不少坑,写在这。

    导入数据

    从Excel文件导入 import xlrd file='test.xls' xls=xlrd.open_workbook(file) #打开文件 xls_sheet=xls.sheet_by_index(0) #第一页内容 xls_row_begin=2 #序号从0开始 这里2代表第3行 xls_col_begin=1 #序号从0开始 这里1代表B列 matrix_size=5 for for ……

    基本类型

    import networkx as nx
    #无向图 G=nx.Graph() #创建一个无向图 G.add_node(1) #添加节点1 G.add_edge(2,3) #添加边,连接节点2、3(也同时创建了节点2、3) #上面语句和G.add_edge(3,2) 等价 因为是无向图 G.nodes() #表示所有节点的List G.edges() #表示所有边的List,其中每条边以(start,end)表示。所以返回值形如 [(1,2),(3,4)] G.number_of_edges() #边的总数,整数。 G.to_directed() #转化为有向图
    #有向图 G=nx.DiGraph() #创建一个无向图 #添加节点和边的方法与无向图一致。 #注意G.add_edge(2,3) 和 G.add_edge(3,2)代表的是2条不同的边 G.to_undirected() #转化为无向图
    #加权图 #有向图和无向图给边赋予权重,即成为了加权图。基本操作和上面一样。 G.add_weighted_edges_from([(0,1,3.0),(1,2,7.5)]) #给0→1的边赋予权重3.0,给1→2的边赋予权重7.5 #特别注意,G.add_weighted_edges_from([(1,1,0)])也会给1添加2条边,一条指出,一条指入。会对后面其他计算会产生影响。应就具体情况在导入时处理。 G.get_edge_data(1,2) #读取1→2的边的权重

    可视化

    可视化一般使用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
    转载请注明原文地址: https://ju.6miu.com/read-679439.html

    最新回复(0)