小书匠Graph图论

graph构建完成后,对graph的连通等属性进行分析.

目录:


注意:如果代码出现找不库,请返回第一个教程,把库文件导入.

8.对图进行分析

强连通:有向图中任意两点v1、v2间存在v1到v2的路径(path)及v2到v1的路径。

弱联通:将有向图的所有的有向边替换为无向边,所得到的图称为原图的基图。如果一个有向图的基图是连通图,则有向图是弱连通图。

8.1连通子图

  1. #定义图的节点和边 

  2. nodes=['0','1','2','3','4','5','a','b','c'] 

  3. 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)] 


  4. #定义graph 

  5. G = nx.Graph() 

  6. G.add_nodes_from(nodes) 

  7. G.add_weighted_edges_from(edges) 


  8. #找到所有连通子图 

  9. print('connected_components of graph: ',list(nx.connected_components(G))) 


  10. #显示该graph 

  11. nx.draw(G, with_labels=True, font_weight='bold') 

  12. plt.axis('on') 

  13. plt.xticks([]) 

  14. plt.yticks([]) 

  15. plt.show() 

输出:

  1. connected_components of graph: [{'a', 'b', 'c'}, {'4', '0', '5', '1', '2'}, {'3'}] 


连通子图例子

8.2弱联通

  1. #定义graph 

  2. G = nx.path_graph(4, create_using=nx.DiGraph()) 

  3. G.add_path([7, 8, 3]) 

  4. G.add_path([5, 6,9]) 


  5. #找出所有的弱连通图 

  6. for c in nx.weakly_connected_components(G): 

  7. print(c) 


  8. #由大到小的规模判断弱连通子图 

  9. print([len(c) for c in sorted(nx.weakly_connected_components(G), key=len, reverse=True)]) 


  10. nx.draw(G, with_labels=True, font_weight='bold') 

  11. plt.axis('on') 

  12. plt.xticks([]) 

  13. plt.yticks([]) 

  14. plt.show() 

输出:

  1. {0, 1, 2, 3, 7, 8} 

  2. {9, 5, 6} 

  3. [6, 3] 


弱联通例子

8.3强连通

  1. G.clear() 


  2. #定义图 

  3. G = nx.path_graph(4, create_using=nx.DiGraph()) 

  4. G.add_path([3, 8, 1]) 


  5. #找出所有的强连通子图 

  6. con = nx.strongly_connected_components(G) 

  7. print(con,type(con),list(con)) 


  8. #显示该图 

  9. nx.draw(G, with_labels=True, font_weight='bold') 

  10. plt.axis('on') 

  11. plt.xticks([]) 

  12. plt.yticks([]) 

  13. plt.show() 

输出:

  1. <generator object strongly_connected_components at 0x7fe0eefe9c50> <class 'generator'> [{8, 1, 2, 3}, {0}] 


强连通例子

8.4子图

  1. G.clear() 


  2. #定义图 

  3. G = nx.DiGraph() 

  4. G.add_path([5, 6, 7, 8]) 

  5. #抽取图G的节点作为子图 

  6. sub_graph = G.subgraph([5, 6, 8]) 


  7. plt.subplots(1,2,figsize=(15,5)) 

  8. #画原图 

  9. plt.subplot(121) 

  10. nx.draw(G, with_labels=True, font_weight='bold') 

  11. plt.title('原图',fontproperties=myfont) 

  12. plt.axis('on') 

  13. plt.xticks([]) 

  14. plt.yticks([]) 


  15. #画子图 

  16. plt.subplot(122) 

  17. nx.draw(sub_graph, with_labels=True, font_weight='bold') 

  18. plt.title('子图',fontproperties=myfont) 

  19. plt.axis('on') 

  20. plt.xticks([]) 

  21. plt.yticks([]) 


  22. plt.show() 


子图例子

8.5条件过滤

  1. #G.clear() 


  2. #定义有向图 

  3. G = nx.DiGraph() 

  4. road_nodes = {'a':{'id':1}, 'b':{'id':1}, 'c':{'id':3}, 'd':{'id':4}} 

  5. road_edges = [('a', 'b'), ('a', 'c'), ('a', 'd'), ('b', 'd')] 

  6. G.add_nodes_from(road_nodes.items()) 

  7. G.add_edges_from(road_edges) 


  8. #过滤函数 

  9. def flt_func_draw(): 

  10. flt_func = lambda d: d['id'] != 1 

  11. return flt_func 


  12. plt.subplots(1,2,figsize=(15,5)) 


  13. #画出原图 

  14. plt.subplot(121) 

  15. nx.draw(G, with_labels=True, font_weight='bold') 

  16. plt.title('过滤前',fontproperties=myfont) 

  17. plt.axis('on') 

  18. plt.xticks([]) 

  19. plt.yticks([]) 


  20. #过滤原图得到子图 

  21. flt_func = flt_func_draw() 

  22. part_G = G.subgraph(n for n, d in G.nodes(data=True) if flt_func(d)) 


  23. #画出子图 

  24. plt.subplot(122) 

  25. nx.draw(part_G, with_labels=True, font_weight='bold') 

  26. plt.title('过滤后',fontproperties=myfont) 

  27. plt.axis('on') 

  28. plt.xticks([]) 

  29. plt.yticks([]) 


  30. plt.show() 


条件过滤后的子图

NetworkX系列教程(7)-对graph进行分析的更多相关文章

  1. NetworkX系列教程(1)-创建graph

    小书匠Graph图论 研究中经常涉及到图论的相关知识,而且常常面对某些术语时,根本不知道在说什么.前不久接触了NetworkX这个graph处理工具,发现这个工具已经解决绝大部分的图论问题(也许只是我 ...

  2. NetworkX系列教程(8)-Drawing Graph

    小书匠Graph图论 如果只是简单使用nx.draw,是无法定制出自己需要的graph,并且这样的graph内的点坐标的不定的,运行一次变一次,实际中一般是要求固定的位置,这就需要到布局的概念了.详细 ...

  3. NetworkX系列教程(6)-对graph进行操作

    小书匠Graph图论 graph生成后,除了有查看操作,还有移除等操作,还有其他更多操作,具体可以看这里.下面将比较graph操作前后的不同. 目录: 7.对图进行操作 7.1移除某些节点和边 7.2 ...

  4. NetworkX系列教程(5)-查看graph的信息

    小书匠Graph图论 有时候graph建好后,我们并不清除该graph内节点的,边的信息,这就需要调用函数去查看了. 目录: 6.查看Graph的信息 6.1查看graph内节点,边的 6.2查看gr ...

  5. NetworkX系列教程(4)-设置graph的信息

    小书匠Graph图论 要画出美观的graph,需要对graph里面的节点,边,节点的布局都要进行设置,具体可以看官方文档:Adding attributes to graphs, nodes, and ...

  6. 自定义View系列教程03--onLayout源码详尽分析

    深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...

  7. 自定义View系列教程02--onMeasure源码详尽分析

    深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...

  8. NetworkX系列教程(2)-graph生成器

    小书匠Graph图论 本节主要讲解如何快速使用内置的方法生成graph,官方的文档在这里,里面包含了networkX的所有graph生成器,下面的内容只是我节选的内容,并将graph画出来而已. 声明 ...

  9. NetworkX系列教程(11)-graph和其他数据格式转换

    小书匠 Graph 图论  学过线性代数的都了解矩阵,在矩阵上的文章可做的很多,什么特征矩阵,单位矩阵等.grpah存储可以使用矩阵,比如graph的邻接矩阵,权重矩阵等,这节主要是在等到graph后 ...

随机推荐

  1. 记一次纯sqlite数据库的小项目开发经历

    sqlite有哪些坑 1.支持的数据量级:根据SQLite的官方提示:http://www.sqlite.org/limits.htmlSQLIte数据库最大支持128TiB(140 terabyte ...

  2. Django Rest framework序列化流程

    目录 一 什么是序列化 二 Django REST framework配置流程之Serializer 三 Django REST framework配置流程之ModelSerializer 一 什么是 ...

  3. JavaScript,遍历,for

    (for循环,for...in ,for...of ,forEach)(:for in总是得到数组,字符串的下标,而for of和forEach一样,是直接得到值) (forEach() 方法用于调用 ...

  4. K2 BPM_规范内部供应链流程,提高企业整体绩效_工作流流程管理

    方案背景 随着企业竞争的加剧.顾客需求的多样化以及市场变化的不确定因素增多,企业与企业间的竞争已经逐步转变为供应链与供应链间的竞争.企业只有在内部各业务流程有机统一的状态下,再与外部企业进行融合与协作 ...

  5. 编写一个stm32 svc关中断函数

    做到了让stm32触发svc中断并传递进去参数然后切换到handler模式并修改特殊寄存器的值,从而达到关中断,但是其实这个程序直接就是特权级,故不进入handler模式也可以修改特殊寄存器..... ...

  6. 前端框架开始学习Vue(一)

    MVVM开发思想图(图片可能会被缩小,请右键另存查看,图片来源于网络)   定义基本Vue代码结构   1 v-text,v-cloak,v-html命令 默认 v-text没有闪烁问题,但是会覆盖元 ...

  7. 解决windows 1903 alt + tab 切换卡顿

    右击此电脑图标 选择管理 服务和应用程序 服务 禁用system interface foundation service

  8. Linux命令——set 和 unset

    参考:Linux set and unset http://www.runoob.com/linux/linux-comm-set.html https://blog.csdn.net/u010003 ...

  9. 剖析.o文件ELF组成

    ELF文件结构组成 ①总共13个节 ②每个节都有一个编号.从ELF头开始编号,编号从0开始,编号的作用就是用来索引(找到)不同节的. ③每个.o的都是这样的结构.链接时要做的就是,将ELF格式的.o全 ...

  10. charles 右键菜单

    本文参考:charles 右键菜单 在网址/域名上右键 可以获得下面菜单 区域 1 基本操作 :基本的URL复制,文件保存,以及选中文件内搜索 区域 2 重写操作 :重写发送请求(调用接口合适),或者 ...