NetworkX系列教程(1)-创建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导入相应包,定义graph
- #导入相应的包
- import networkx as nx
- from PIL import Image
- import matplotlib.pyplot as plt
- from networkx.drawing.nx_pydot import to_pydot
- from matplotlib.font_manager import *
- #定义自定义字体,文件名从1.b查看系统中文字体中来,这是Linux字体路径,windows系统的字体路径自查
- myfont = FontProperties(fname='/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc')
- #解决负号'-'显示为方块的问题
- matplotlib.rcParams['axes.unicode_minus']=False
- #定义图的节点和边
- 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)]
- #用于显示图片
- def ShowGraph(G):
- #使用pydot保存图片
- P=to_pydot(G)
- P.write_jpeg('pydot.png')
- #使用matplotlib保存图片
- pos=nx.shell_layout(G)
- nx.draw(G,pos,with_labels=True)
- plt.savefig('mat.png')
- plt.close()
- #将前面两张图显示
- plt.subplots(figsize=(12,6))
- #plt.suptitle('Diffrent')
- #载入matplotlib的图片
- plt.subplot(1,2,1)
- plt.title('matplotlib')
- plt.imshow(Image.open('mat.png'))
- #plt.axis('off')
- #去掉坐标刻度
- plt.xticks([])
- plt.yticks([])
- #载入pydot的图片
- plt.subplot(1,2,2)
- plt.title('pydot')
- plt.imshow(Image.open('pydot.png'))
- #plt.axis('off')
- #去掉坐标刻度
- plt.xticks([])
- plt.yticks([])
- #显示图片
- plt.show()
1.2有自循环的无向图
- #定义无向图
- G = nx.Graph()
- #往图添加节点和边
- G.add_nodes_from(nodes)
- G.add_weighted_edges_from(edges)
- #显示图片
- ShowGraph(G)

1.3有自循环的有向图
- #清除前面的无向图
- G.clear()
- #定义有向图
- G = nx.DiGraph()
- #添加节点和边
- G.add_nodes_from(nodes)
- G.add_weighted_edges_from(edges)
- #显示图片
- ShowGraph(G)

1.4有自循环和平行边的无向图
- #清除前面的无向图
- G.clear()
- #定义带平行边无向图
- G = nx.MultiGraph()
- #添加节点和边
- G.add_nodes_from(nodes)
- G.add_weighted_edges_from(edges)
- #显示图片
- ShowGraph(G)

1.5有自循环和平行边的有向图
- #清除前面的无向图
- G.clear()
- #定义带平行边有向图
- G = nx.MultiDiGraph()
- #添加节点和边
- G.add_nodes_from(nodes)
- G.add_weighted_edges_from(edges)
- #显示图片
- ShowGraph(G)

NetworkX系列教程(1)-创建graph的更多相关文章
- NetworkX系列教程(4)-设置graph的信息
小书匠Graph图论 要画出美观的graph,需要对graph里面的节点,边,节点的布局都要进行设置,具体可以看官方文档:Adding attributes to graphs, nodes, and ...
- NetworkX系列教程(8)-Drawing Graph
小书匠Graph图论 如果只是简单使用nx.draw,是无法定制出自己需要的graph,并且这样的graph内的点坐标的不定的,运行一次变一次,实际中一般是要求固定的位置,这就需要到布局的概念了.详细 ...
- NetworkX系列教程(7)-对graph进行分析
小书匠Graph图论 graph构建完成后,对graph的连通等属性进行分析. 目录: 8.对图进行分析 8.1连通子图 8.2弱联通 8.3强连通 8.4子图 8.5条件过滤 注意:如果代码出现找不 ...
- 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系列教程(3)-手动创建graph
小书匠Graph图论 不可否认,日常中我们使用最多的还是,使用自己的数据去手动创建自己的图形,而不是使用生成器,现从给graph添加点和边入手,讲解手动创建graph. 目录: 3.给graph添加节 ...
- NetworkX系列教程(11)-graph和其他数据格式转换
小书匠 Graph 图论 学过线性代数的都了解矩阵,在矩阵上的文章可做的很多,什么特征矩阵,单位矩阵等.grpah存储可以使用矩阵,比如graph的邻接矩阵,权重矩阵等,这节主要是在等到graph后 ...
- Spring Boot2 系列教程(二)创建 Spring Boot 项目的三种方式
我最早是 2016 年底开始写 Spring Boot 相关的博客,当时使用的版本还是 1.4.x ,文章发表在 CSDN 上,阅读量最大的一篇有 43W+,如下图: 2017 年由于种种原因,就没有 ...
- NetworkX系列教程(2)-graph生成器
小书匠Graph图论 本节主要讲解如何快速使用内置的方法生成graph,官方的文档在这里,里面包含了networkX的所有graph生成器,下面的内容只是我节选的内容,并将graph画出来而已. 声明 ...
随机推荐
- 【统计与建模】R语言基本操作
# vec <- rep( seq(1,5,by=0.5),3) # vec <- seq( 1 , 10 , by = 1 ) # min(vec) #最小值 # max(vec) #最 ...
- 题解-CTS2019随机立方体
problem \(\mathtt {loj-3119}\) 题意概要:一个 \(n\times m\times l\) 的立方体,立方体中每个格子上都有一个数,如果某个格子上的数比三维坐标中至少有一 ...
- 天梯赛 L3-002. 堆栈
思路:这里的线段树维护一个区间里面出现数的个数,对于Pop,push单点更新一下就好. #include<stdio.h> #include<iostream> #includ ...
- javascript中bind()、call()、apply()的使用
一直以来对bind().apply().call()这三个方法都模模糊糊的,现在有时间详细的看看这三个方法,并记录下来. bind() 参考文档:https://developer.mozilla.o ...
- MACOS 安装mysqlclient 的 Library not loaded错误
报错场景 >>> import MySQLdb Traceback (most recent call last): File "<stdin>", ...
- echart——关系图graph详解
VueEchart组件见上一篇 <template> <VueEcharts :options="options" auto-resize /> </ ...
- 上传文件(lrzsz)
执行命令:yum -y install lrzsz 现在就可以正常使用rz.sz命令上传.下载数据了. 上传文件,执行命令rz,会跳出文件选择窗口,选择好文件,点击确认即可. 下载文件,执行命令sz
- 牛客练习赛48 C 小w的糖果 (数学,多项式,差分)
牛客练习赛48 C 小w的糖果 (数学,多项式) 链接:https://ac.nowcoder.com/acm/contest/923/C来源:牛客网 题目描述 小w和他的两位队友teito.toki ...
- SpringBoot项目mysql配置文件密码加密(jasypt)
起因:因为我个人微博想要公开源码,但数据库配置文件会暴露在外面,又不想生产跟开发环境建来回切换,所以想到了加密数据库密码,于是问了群里的一个朋友小XX(原谅我不识字) 经过: 简单粗暴,直接上代码: ...
- 遇见zTree和chrome的俩坑
今天后台系统发现一bug,就是前几天用zTree做的树形结构,今下午突然不好使了,然后就查问题.我自己电脑装的是chrome浏览器,后台debug一看传的json数据,没毛病,想当然的断定不是数据的问 ...