小书匠Graph图论

研究中经常涉及到图论的相关知识,而且常常面对某些术语时,根本不知道在说什么.前不久接触了NetworkX这个graph处理工具,发现这个工具已经解决绝大部分的图论问题(也许只是我自己认为的,没有证据证明),所以把这个工具的使用学习下,顺便学习图论的相关知识.

NetworkX本来是有官方文档的,花时间去学也是可以的,我这里把认为重要的整理出来.这些内容会分几次发布,做成一个系列使用教程.

系统环境:

linuxmint 18.3

python 3.5.2

numpy 1.14.3

matplotlib 1.5.1

networkx 2.1

全文注意事项:

1.为了方便,graph我有时候会称为,这时候不要将这个和图片混淆了.

2.代码中会频繁使用G.clear(),这是在画新的graph之前,先清空原先的graph

3.matplotlib包不能显示平行边,自循环这类的边,所以需要借助pydot包来显示,不过一般使用matplotlib来显示


目录:

1.创建一个Graph

例子:

下面涉及的graph如果不是特别需要,我将使用图1这个手动创建的graph,这个graph有双向边,有孤岛节点,有平行边,有自循环


图1 例子图

1.1导入相应包,定义graph

  1. #导入相应的包 

  2. import networkx as nx 

  3. from PIL import Image 

  4. import matplotlib.pyplot as plt 

  5. from networkx.drawing.nx_pydot import to_pydot 

  6. from matplotlib.font_manager import *  


  7. #定义自定义字体,文件名从1.b查看系统中文字体中来,这是Linux字体路径,windows系统的字体路径自查 

  8. myfont = FontProperties(fname='/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc')  

  9. #解决负号'-'显示为方块的问题  

  10. matplotlib.rcParams['axes.unicode_minus']=False  


  11. #定义图的节点和边 

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

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


  14. #用于显示图片 

  15. def ShowGraph(G): 

  16. #使用pydot保存图片 

  17. P=to_pydot(G)  

  18. P.write_jpeg('pydot.png') 


  19. #使用matplotlib保存图片 

  20. pos=nx.shell_layout(G) 

  21. nx.draw(G,pos,with_labels=True) 

  22. plt.savefig('mat.png') 

  23. plt.close()  


  24. #将前面两张图显示 

  25. plt.subplots(figsize=(12,6)) 

  26. #plt.suptitle('Diffrent') 

  27. #载入matplotlib的图片 

  28. plt.subplot(1,2,1) 

  29. plt.title('matplotlib') 

  30. plt.imshow(Image.open('mat.png')) 

  31. #plt.axis('off') 

  32. #去掉坐标刻度 

  33. plt.xticks([]) 

  34. plt.yticks([]) 


  35. #载入pydot的图片 

  36. plt.subplot(1,2,2) 

  37. plt.title('pydot') 

  38. plt.imshow(Image.open('pydot.png')) 

  39. #plt.axis('off') 

  40. #去掉坐标刻度 

  41. plt.xticks([]) 

  42. plt.yticks([]) 


  43. #显示图片 

  44. plt.show()  

1.2有自循环的无向图

  1. #定义无向图 

  2. G = nx.Graph() 


  3. #往图添加节点和边 

  4. G.add_nodes_from(nodes) 

  5. G.add_weighted_edges_from(edges) 


  6. #显示图片 

  7. ShowGraph(G) 


有自循环的无向图

1.3有自循环的有向图

  1. #清除前面的无向图 

  2. G.clear() 


  3. #定义有向图 

  4. G = nx.DiGraph() 

  5. #添加节点和边 

  6. G.add_nodes_from(nodes) 

  7. G.add_weighted_edges_from(edges) 


  8. #显示图片 

  9. ShowGraph(G) 


有自循环的有向图

1.4有自循环和平行边的无向图

  1. #清除前面的无向图 

  2. G.clear() 


  3. #定义带平行边无向图 

  4. G = nx.MultiGraph() 

  5. #添加节点和边 

  6. G.add_nodes_from(nodes) 

  7. G.add_weighted_edges_from(edges) 


  8. #显示图片 

  9. ShowGraph(G) 


有自循环和平行边的无向图

1.5有自循环和平行边的有向图

  1. #清除前面的无向图 

  2. G.clear() 


  3. #定义带平行边有向图 

  4. G = nx.MultiDiGraph() 

  5. #添加节点和边 

  6. G.add_nodes_from(nodes) 

  7. G.add_weighted_edges_from(edges) 


  8. #显示图片 

  9. ShowGraph(G) 


有自循环和平行边的有向图

NetworkX系列教程(1)-创建graph的更多相关文章

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

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

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

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

  3. NetworkX系列教程(7)-对graph进行分析

    小书匠Graph图论 graph构建完成后,对graph的连通等属性进行分析. 目录: 8.对图进行分析 8.1连通子图 8.2弱联通 8.3强连通 8.4子图 8.5条件过滤 注意:如果代码出现找不 ...

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

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

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

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

  6. NetworkX系列教程(3)-手动创建graph

    小书匠Graph图论 不可否认,日常中我们使用最多的还是,使用自己的数据去手动创建自己的图形,而不是使用生成器,现从给graph添加点和边入手,讲解手动创建graph. 目录: 3.给graph添加节 ...

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

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

  8. Spring Boot2 系列教程(二)创建 Spring Boot 项目的三种方式

    我最早是 2016 年底开始写 Spring Boot 相关的博客,当时使用的版本还是 1.4.x ,文章发表在 CSDN 上,阅读量最大的一篇有 43W+,如下图: 2017 年由于种种原因,就没有 ...

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

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

随机推荐

  1. Python虚拟环境virtualenv的安装与使用详解(转)

    virtualenv参考:https://www.jb51.net/article/114933.htm virtualenvwrapper参考:https://www.jianshu.com/p/7 ...

  2. vijo 1456最小总代价

    题意:中文题... 题解:状态比较多,可以说是状压的基础题吧,我们定义dp[i][j],j为一个二进制数,每位0表示接触过该物品,1表示没有接触过;j表示当前物品在谁手上.递推的顺序注意一下就好 ac ...

  3. ASP.NET Core 2.1 中的 HttpClientFactory (Part 2) 定义命名化和类型化的客户端

    原文:https://www.stevejgordon.co.uk/httpclientfactory-named-typed-clients-aspnetcore  发表于:2018年1月 上一篇文 ...

  4. 测试winform程序到树莓派运行

    啥也不说了,都在下图中了.winform可以在树莓派上跑了

  5. shim和polyfill 区别解释

    polyfill 是 shim 的一种.shim 是将不同 api 封装成一种,比如 jQuery 的 $.ajax 封装了 XMLHttpRequest 和 IE 用 ActiveXObject 方 ...

  6. 有用的vscode快捷键大全+自定义快捷键

    VS Code是前端的一个比较好用的代码编辑器,但是我们不能老是局限于鼠标操作呀,有时候很不方便,所以呢,快捷键大全来啦,有的可能会和你们电脑自带的快捷键冲突呢,这时候,你自己设置一下就好了呀 一.v ...

  7. Java 之 字符输出流[writer]

    一.字符输出流 java.io.Writer 抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地.   它定义了字节输出流的基本共性功能方法. void write(int c) ...

  8. python之random、time与sys模块

     一.random模块 import random # float型 print(random.random()) #取0-1之间的随机小数 print(random.uniform(n,m)) #取 ...

  9. c++混合使用不同标准编译潜在的问题

    最近项目使用的C++的版本到C++11了,但是由于有些静态库(.a)没有源码,因此链接时还在使用非C++11版本的库文件.目前跑了几天,似乎是没出什么问题,但是我还是想说一下这样做有哪些潜在的风险. ...

  10. 【蜂窝】at+qcfg="band"的计算和使用

    查询附件 Quectel_EC25_LTE_模块产品规格书_V1.6 可知当前的蜂窝模块所对应的band频带是什么? eg.1 EC25-AU 当前选择4G 优先, FDD LTE 可看手册QCFG命 ...