NetworkX系列教程(7)-对graph进行分析
graph构建完成后,对graph的连通等属性进行分析.
目录:
注意:如果代码出现找不库,请返回第一个教程,把库文件导入.
8.对图进行分析
强连通:有向图中任意两点v1、v2间存在v1到v2的路径(path)及v2到v1的路径。
弱联通:将有向图的所有的有向边替换为无向边,所得到的图称为原图的基图。如果一个有向图的基图是连通图,则有向图是弱连通图。
8.1连通子图
- #定义图的节点和边
- nodes=['0','1','2','3','4','5','a','b','c']
- edges=[('0','0',1),('0','1',1),('0','5',1),('0','5',2),('1','2',3),('1','4',5),('2','1',7),('2','4',6),('a','b',0.5),('b','c',0.5),('c','a',0.5)]
- #定义graph
- G = nx.Graph()
- G.add_nodes_from(nodes)
- G.add_weighted_edges_from(edges)
- #找到所有连通子图
- print('connected_components of graph: ',list(nx.connected_components(G)))
- #显示该graph
- nx.draw(G, with_labels=True, font_weight='bold')
- plt.axis('on')
- plt.xticks([])
- plt.yticks([])
- plt.show()
输出:
- connected_components of graph: [{'a', 'b', 'c'}, {'4', '0', '5', '1', '2'}, {'3'}]

8.2弱联通
- #定义graph
- G = nx.path_graph(4, create_using=nx.DiGraph())
- G.add_path([7, 8, 3])
- G.add_path([5, 6,9])
- #找出所有的弱连通图
- for c in nx.weakly_connected_components(G):
- print(c)
- #由大到小的规模判断弱连通子图
- print([len(c) for c in sorted(nx.weakly_connected_components(G), key=len, reverse=True)])
- nx.draw(G, with_labels=True, font_weight='bold')
- plt.axis('on')
- plt.xticks([])
- plt.yticks([])
- plt.show()
输出:
- {0, 1, 2, 3, 7, 8}
- {9, 5, 6}
- [6, 3]

8.3强连通
- G.clear()
- #定义图
- G = nx.path_graph(4, create_using=nx.DiGraph())
- G.add_path([3, 8, 1])
- #找出所有的强连通子图
- con = nx.strongly_connected_components(G)
- print(con,type(con),list(con))
- #显示该图
- nx.draw(G, with_labels=True, font_weight='bold')
- plt.axis('on')
- plt.xticks([])
- plt.yticks([])
- plt.show()
输出:
- <generator object strongly_connected_components at 0x7fe0eefe9c50> <class 'generator'> [{8, 1, 2, 3}, {0}]

8.4子图
- G.clear()
- #定义图
- G = nx.DiGraph()
- G.add_path([5, 6, 7, 8])
- #抽取图G的节点作为子图
- sub_graph = G.subgraph([5, 6, 8])
- plt.subplots(1,2,figsize=(15,5))
- #画原图
- plt.subplot(121)
- nx.draw(G, with_labels=True, font_weight='bold')
- plt.title('原图',fontproperties=myfont)
- plt.axis('on')
- plt.xticks([])
- plt.yticks([])
- #画子图
- plt.subplot(122)
- nx.draw(sub_graph, with_labels=True, font_weight='bold')
- plt.title('子图',fontproperties=myfont)
- plt.axis('on')
- plt.xticks([])
- plt.yticks([])
- plt.show()

8.5条件过滤
- #G.clear()
- #定义有向图
- G = nx.DiGraph()
- road_nodes = {'a':{'id':1}, 'b':{'id':1}, 'c':{'id':3}, 'd':{'id':4}}
- road_edges = [('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'd')]
- G.add_nodes_from(road_nodes.items())
- G.add_edges_from(road_edges)
- #过滤函数
- def flt_func_draw():
- flt_func = lambda d: d['id'] != 1
- return flt_func
- plt.subplots(1,2,figsize=(15,5))
- #画出原图
- plt.subplot(121)
- nx.draw(G, with_labels=True, font_weight='bold')
- plt.title('过滤前',fontproperties=myfont)
- plt.axis('on')
- plt.xticks([])
- plt.yticks([])
- #过滤原图得到子图
- flt_func = flt_func_draw()
- part_G = G.subgraph(n for n, d in G.nodes(data=True) if flt_func(d))
- #画出子图
- plt.subplot(122)
- nx.draw(part_G, with_labels=True, font_weight='bold')
- plt.title('过滤后',fontproperties=myfont)
- plt.axis('on')
- plt.xticks([])
- plt.yticks([])
- plt.show()

NetworkX系列教程(7)-对graph进行分析的更多相关文章
- NetworkX系列教程(1)-创建graph
小书匠Graph图论 研究中经常涉及到图论的相关知识,而且常常面对某些术语时,根本不知道在说什么.前不久接触了NetworkX这个graph处理工具,发现这个工具已经解决绝大部分的图论问题(也许只是我 ...
- NetworkX系列教程(8)-Drawing Graph
小书匠Graph图论 如果只是简单使用nx.draw,是无法定制出自己需要的graph,并且这样的graph内的点坐标的不定的,运行一次变一次,实际中一般是要求固定的位置,这就需要到布局的概念了.详细 ...
- NetworkX系列教程(6)-对graph进行操作
小书匠Graph图论 graph生成后,除了有查看操作,还有移除等操作,还有其他更多操作,具体可以看这里.下面将比较graph操作前后的不同. 目录: 7.对图进行操作 7.1移除某些节点和边 7.2 ...
- NetworkX系列教程(5)-查看graph的信息
小书匠Graph图论 有时候graph建好后,我们并不清除该graph内节点的,边的信息,这就需要调用函数去查看了. 目录: 6.查看Graph的信息 6.1查看graph内节点,边的 6.2查看gr ...
- NetworkX系列教程(4)-设置graph的信息
小书匠Graph图论 要画出美观的graph,需要对graph里面的节点,边,节点的布局都要进行设置,具体可以看官方文档:Adding attributes to graphs, nodes, and ...
- 自定义View系列教程03--onLayout源码详尽分析
深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...
- 自定义View系列教程02--onMeasure源码详尽分析
深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...
- NetworkX系列教程(2)-graph生成器
小书匠Graph图论 本节主要讲解如何快速使用内置的方法生成graph,官方的文档在这里,里面包含了networkX的所有graph生成器,下面的内容只是我节选的内容,并将graph画出来而已. 声明 ...
- NetworkX系列教程(11)-graph和其他数据格式转换
小书匠 Graph 图论 学过线性代数的都了解矩阵,在矩阵上的文章可做的很多,什么特征矩阵,单位矩阵等.grpah存储可以使用矩阵,比如graph的邻接矩阵,权重矩阵等,这节主要是在等到graph后 ...
随机推荐
- HTTP无状态协议理解
TTP协议是无状态协议. 无状态是指协议对于事务处理没有记忆能力.缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大.另一方面,在服务器不需要先前信息时它的应 ...
- 3_PHP表达式_2_变量
以下为学习孔祥盛主编的<PHP编程基础与实例教程>(第二版)所做的笔记. PHP变量可分为自定义变量和预定义变量. 以下所谈到的变量均为自定义变量. 1.变量的基本概念 PHP的变量名遵循 ...
- 数据备份 及 Python 操作 Mysql
一 MySQL数据备份 #1. 物理备份: 直接复制数据库文件,适用于大型数据库环境.但不能恢复到异构系统中如Windows. #2. 逻辑备份: 备份的是建表.建库.插入等操作所执行SQL语句,适用 ...
- 【转载】C#使用FirstOrDefault方法快速查找List集合中符合条件的第一个实体
在C#的List集合的操作中,有时候我们需要根据相关条件快速从List集合中获取到第一个符合条件的实体对象,例如有个全校班级的List集合,我们需要根据班级代码快速从List集合中查找出班级信息.可以 ...
- jquery input file 多图上传,单张删除,查看
<div class="form-group"> <label for="imgs" class="col-md-3 col-sm- ...
- UI5-技术篇-Navigation And Routing
主要记录下Router设置过程中出现的几个问题 1.View 首页设置 controlId 2.Manifest设置 2.1设置启动页 2.2设置默认配置 2.3设置Targets 首页设置 子页设置 ...
- 改变说明文档显示位置wrap
装饰器会改变文档的显示位置 例子1:使用wrap前,输出内函数中的说明文档 def check(fun): """检查权限的装饰器""" d ...
- 【leetcode】544. Output Contest Matches
原题 During the NBA playoffs, we always arrange the rather strong team to play with the rather weak te ...
- JAVA中为什么要使用接口,继承接口不是还要重写方法吗?为什么不直接写那些方法呢?:::接口的最主要的作用是达到统一访问
接口的最主要的作用是达到统一访问 那么什么叫统一访问呢 举个例子 你这样想,我做一个USB接口,有个读的抽象方法 那叫read()吧,然后mp3类实现,U盘类实现,移动硬盘类实现,这样我用的时候用US ...
- Go语言中的IO操作、Flag包以及urfave/cli命令行框架
一.格式化输入和输出 1.从终端获取用户的输入 fmt.Scanf 空格作为分隔符,占位符和格式化输出的一致 fmt.Scan 从终端获取用户的输入,存储在Scanln中的参数里,空格和换行符作为 ...