作者 | yyl424525

来源 | CSDN博客

文章目录

1. 简介

  • 安装

  • 支持四种图

  • 绘制网络图基本流程

2. Graph-无向图

节点

属性

有向图和无向图互转

3. DiGraph-有向图

  • 一些精美的图例子

  • 环形树状图

  • 权重图

  • Giant Component

  • Random Geometric Graph 随机几何图

  • 节点颜色渐变

  • 边的颜色渐变

  • Atlas

  • 画个五角星

  • Club

  • 画一个多层感知机

  • 绘制一个DNN结构图

  • 一些图论算法

  • 最短路径

4. 问题

  • 一些其他神经网络绘制工具列表

5. 参考

1 简介

networkx是一个用Python语言开发的图论与复杂网络建模工具,内置了常用的图与复杂网络分析算法,可以方便的进行复杂网络数据分析、仿真建模等工作。

利用networkx可以以标准化和非标准化的数据格式存储网络、生成多种随机网络和经典网络、分析网络结构、建立网络模型、设计新的网络算法、进行网络绘制等。

networkx支持创建简单无向图、有向图和多重图(multigraph);内置许多标准的图论算法,节点可为任意数据;支持任意的边值维度,功能丰富,简单易用。

networkx以图(graph)为基本数据结构。图既可以由程序生成,也可以来自在线数据源,还可以从文件与数据库中读取。

安装

安装的话,跟其他包的安装差不多,用的是anaconda就不用装了。其他就用pip install networkx。

查看版本:

1>>> import networkx

2>>> networkx.__version__

3'1.11'

升级

1pip install --upgrade networkx

下面配合使用的一些库,可以选择性安装:

后面可能用到pygraphviz,安装方法如下(亲测有效):

1sudo apt-get install graphviz

2sudo apt-get install graphviz libgraphviz-dev pkg-config

3sudo apt-get install python-pip python-virtualenv

4pip install pygraphviz

windows的安装参考这篇博客:https://blog.csdn.net/fadai1993/article/details/82491657#2____linux_9

安装cv2:

1pip install opencv-python #安装非常慢,用下面的方式,从清华源下载

2pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python

支持四种图

  • Graph:无多重边无向图

  • DiGraph:无多重边有向图

  • MultiGraph:有多重边无向图

  • MultiDiGraph:有多重边有向图

空图对象的创建方式

1import networkx as nx

2G=nx.Graph

3G=nx.DiGraph

4G=nx.MultiGraph

5G=nx.MultiDiGraph

6G.clear #清空图

绘制网络图基本流程

  • 导入networkx,matplotlib包

  • 建立网络

  • 绘制网络 nx.draw

  • 建立布局 pos = nx.spring_layout美化作用

最基本画图程序

1import import networkx as nx #导入networkx包

2import matplotlib.pyplot as plt

3G = nx.random_graphs.barabasi_albert_graph(100,1) #生成一个BA无标度网络G

4nx.draw(G) #绘制网络G

5plt.savefig("ba.png") #输出方式1: 将图像存为一个png格式的图片文件

6plt.show #输出方式2: 在窗口中显示这幅图像

networkx 提供画图的函数

1draw(G,[pos,ax,hold])

2draw_networkx(G,[pos,with_labels])

3draw_networkx_nodes(G,pos,[nodelist])绘制网络G的节点图

4draw_networkx_edges(G,pos[edgelist])绘制网络G的边图

5draw_networkx_edge_labels(G, pos[, …]) 绘制网络G的边图,边有label

6—有layout 布局画图函数的分界线—

7draw_circular(G, **kwargs) Draw the graph G with a circular layout.

8draw_random(G, **kwargs) Draw the graph G with a random layout.

9draw_spectral(G, **kwargs)Draw the graph G with a spectral layout.

10draw_spring(G, **kwargs)Draw the graph G with a spring layout.

11draw_shell(G, **kwargs) Draw networkx graph with shell layout.

12draw_graphviz(G[, prog])Draw networkx graph with graphviz layout.

networkx 画图函数里的一些参数

  • pos(dictionary, optional): 图像的布局,可选择参数;如果是字典元素,则节点是关键字,位置是对应的值。如果没有指明,则会是spring的布局;也可以使用其他类型的布局,具体可以查阅networkx.layout

  • arrows :布尔值,默认True; 对于有向图,如果是True则会画出箭头

  • with_labels: 节点是否带标签(默认为True)

  • ax:坐标设置,可选择参数;依照设置好的Matplotlib坐标画图

  • nodelist:一个列表,默认G.nodes; 给定节点

  • edgelist:一个列表,默认G.edges;给定边

  • node_size: 指定节点的尺寸大小(默认是300,单位未知,就是上图中那么大的点)

  • node_color: 指定节点的颜色 (默认是红色,可以用字符串简单标识颜色,例如’r’为红色,'b’为绿色等,具体可查看手册),用“数据字典”赋值的时候必须对字典取值(.values())后再赋值

  • node_shape: 节点的形状(默认是圆形,用字符串’o’标识,具体可查看手册)

  • alpha: 透明度 (默认是1.0,不透明,0为完全透明)

  • cmap:Matplotlib的颜色映射,默认None; 用来表示节点对应的强度

  • vmin,vmax:浮点数,默认None;节点颜色映射尺度的最大和最小值

  • linewidths:[None|标量|一列值];图像边界的线宽

  • width: 边的宽度 (默认为1.0)

  • edge_color: 边的颜色(默认为黑色)

  • edge_cmap:Matplotlib的颜色映射,默认None; 用来表示边对应的强度

  • edge_vmin,edge_vmax:浮点数,默认None;边的颜色映射尺度的最大和最小值

  • style: 边的样式(默认为实现,可选:solid|dashed|dotted,dashdot)

  • labels:字典元素,默认None;文本形式的节点标签

  • font_size: 节点标签字体大小 (默认为12)

  • font_color: 节点标签字体颜色(默认为黑色)

  • node_size:节点大小

  • font_weight:字符串,默认’normal’

  • font_family:字符串,默认’sans-serif’

布局指定节点排列形式

  • circular_layout:节点在一个圆环上均匀分布

  • random_layout:节点随机分布shell_layout:节点在同心圆上分布

  • spring_layout:用Fruchterman-Reingold算法排列节点,中心放射状分布

  • spectral_layout:根据图的拉普拉斯特征向量排列节点

  • 布局也可用pos参数指定,例如,nx.draw(G, pos = spring_layout(G)) 这样指定了networkx上以中心放射状分布.

2 Graph-无向图

如果添加的节点和边是已经存在的,是不会报错的,NetworkX会自动忽略掉已经存在的边和节点的添加。

节点

常用函数

  • nodes(G):在图节点上返回一个迭代器

  • number_of_nodes(G):返回图中节点的数量

  • all_neighbors(graph, node):返回图中节点的所有邻居

  • non_neighbors(graph, node):返回图中没有邻居的节点

  • common_neighbors(G, u, v):返回图中两个节点的公共邻居

1import networkx as nx

2import matplotlib.pyplot as plt

3G = nx.Graph # 建立一个空的无向图G

4#增加节点

5G.add_node('a') # 添加一个节点1

6G.add_nodes_from(['b', 'c', 'd', 'e']) # 加点集合

7G.add_cycle(['f', 'g', 'h', 'j']) # 加环

8H = nx.path_graph(10) # 返回由10个节点的无向图

9G.add_nodes_from(H) # 创建一个子图H加入G

10G.add_node(H) # 直接将图作为节点

11

12nx.draw(G, with_labels=True,node_color='red')

13plt.show

14

15#访问节点

16print('图中所有的节点', G.nodes)

17#图中所有的节点 [0, 1, 2, 3, 'a', 'c', 'f', 7, 8, 9, , 'g', 'e', 'h', 'b', 4, 6, 5, 'j', 'd']

18

19print('图中节点的个数', G.number_of_nodes)

20#图中节点的个数 20

21

22#删除节点

23G.remove_node(1) #删除指定节点

24G.remove_nodes_from(['b','c','d','e']) #删除集合中的节点

常用函数

  • edges(G[, nbunch]):返回与nbunch中的节点相关的边的视图

  • number_of_edges(G):返回图中边的数目

  • non_edges(graph):返回图中不存在的边

1import networkx as nx

2import matplotlib.pyplot as plt

3

4#添加边方法1

5

6F = nx.Graph # 创建无向图

7F.add_edge(11,12) #一次添加一条边

8

9#添加边方法2

10e=(13,14) #e是一个元组

11F.add_edge(*e) #这是python中解包裹的过程

12

13#添加边方法3

14F.add_edges_from([(1,2),(1,3)]) #通过添加list来添加多条边

15

16H = nx.path_graph(10) #返回由10个节点的无向图

17#通过添加任何ebunch来添加边

18F.add_edges_from(H.edges) #不能写作F.add_edges_from(H)

19

20nx.draw(F, with_labels=True)

21plt.show

22

23#访问边

24print('图中所有的边', F.edges)

25# 图中所有的边 [(0, 1), (1, 2), (1, 3), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9), (11, 12), (13, 14)]

26

27print('图中边的个数', F.number_of_edges)

28# 图中边的个数 12

29

30

31

32#删除边

33F.remove_edge(1,2)

34F.remove_edges_from([(11,12), (13,14)])

35

36nx.draw(F, with_labels=True)

37plt.show

使用邻接迭代器遍历每一条边

1import networkx as nx

2import matplotlib.pyplot as plt

3

4#快速遍历每一条边,可以使用邻接迭代器实现,对于无向图,每一条边相当于两条有向边

5FG = nx.Graph

6FG.add_weighted_edges_from([(1,2,0.125), (1,3,0.75), (2,4,1.2), (3,4,0.275)])

7for n, nbrs in FG.adjacency_iter:

8 for nbr, eattr in nbrs.items:

9 data = eattr['weight']

10 print('(%d, %d, %0.3f)' % (n,nbr,data))

11 # (1, 2, 0.125)

12 # (1, 3, 0.750)

13 # (2, 1, 0.125)

14 # (2, 4, 1.200)

15 # (3, 1, 0.750)

16 # (3, 4, 0.275)

17 # (4, 2, 1.200)

18 # (4, 3, 0.275)

19

20print('***********************************')

21

22#筛选weight小于0.5的边:

23FG = nx.Graph

24FG.add_weighted_edges_from([(1,2,0.125), (1,3,0.75), (2,4,1.2), (3,4,0.275)])

25for n, nbrs in FG.adjacency_iter:

26 for nbr, eattr in nbrs.items:

27 data = eattr['weight']

28 if data < 0.5:

29 print('(%d, %d, %0.3f)' % (n,nbr,data))

30 # (1, 2, 0.125)

31 # (2, 1, 0.125)

32 # (3, 4, 0.275)

33 # (4, 3, 0.275)

34

35print('***********************************')

36

37#一种方便的访问所有边的方法:

38for u,v,d in FG.edges(data = 'weight'):

39 print((u,v,d))

40 # (1, 2, 0.125)

41 # (1, 3, 0.75)

42 # (2, 4, 1.2)

43 # (3, 4, 0.275)

属性

属性诸如weight,labels,colors,或者任何对象,都可以附加到图、节点或边上。

对于每一个图、节点和边都可以在关联的属性字典中保存一个(多个)键-值对。

默认情况下这些是一个空的字典,但是可以增加或者是改变这些属性。

图的属性

1#图的属性

2

3import networkx as nx

4

5G = nx.Graph(day='Monday') #可以在创建图时分配图的属性

6print(G.graph)

7

8G.graph['day'] = 'Friday' #也可以修改已有的属性

9print(G.graph)

10

11G.graph['name'] = 'time' #可以随时添加新的属性到图中

12print(G.graph)

13

14输出:

15{'day': 'Monday'}

16{'day': 'Friday'}

17{'day': 'Friday', 'name': 'time'}

节点的属性

1#节点的属性

2import networkx as nx

3

4G = nx.Graph(day='Monday')

5G.add_node(1, index='1th') #在添加节点时分配节点属性

6# print(G.node(data=True)) #TypeError: 'dict' object is not callable

7print(G.node)

8#{1: {'index': '1th'}}

9

10

11G.node[1]['index'] = '0th' #通过G.node来添加或修改属性

12print(G.node)

13# {1: {'index': '0th'}}

14

15

16G.add_nodes_from([2,3], index='2/3th') #从集合中添加节点时分配属性

17print(G.node)

18# {1: {'index': '0th'}, 2: {'index': '2/3th'}, 3: {'index': '2/3th'}}

边的属性

1#边的属性

2import networkx as nx

3

4G = nx.Graph(day='manday')

5G.add_edge(1,2,weight=10) #在添加边时分配属性

6print(G.edges(data=True))

7#[(1, 2, {'weight': 10})]

8

9G.add_edges_from([(1,3), (4,5)], len=22) #从集合中添加边时分配属性

10print(G.edges(data='len'))

11# [(1, 2, None), (1, 3, 22), (4, 5, 22)]

12

13G.add_edges_from([(3,4,{'hight':10}),(1,4,{'high':'unknow'})])

14print(G.edges(data=True))

15# [(1, 2, {'weight': 10}), (1, 3, {'len': 22}), (1, 4, {'high': 'unknow'}), (3, 4, {'hight': 10}), (4, 5, {'len': 22})]

16

17

18G[1][2]['weight'] = 100000 #通过G来添加或修改属性

19print(G.edges(data=True))

20# [(1, 2, {'weight': 100000}), (1, 3, {'len': 22}), (1, 4, {'high': 'unknow'}), (3, 4, {'hight': 10}), (4, 5, {'len': 22})]

有向图和无向图互转

有向图和多重图的基本操作与无向图一致。

无向图与有向图之间可以相互转换,转化方法如下:

1#有向图转化成无向图

2

3H=DG.to_undirected

4#或者

5H=nx.Graph(DG)

6

7#无向图转化成有向图

8

9F = H.to_directed

10#或者

11F = nx.DiGraph(H)

3、DiGraph-有向图

1import networkx as nx

2import matplotlib.pyplot as plt

3

4G = nx.DiGraph

5G.add_node(1)

6G.add_node(2)

7G.add_nodes_from([3,4,5,6])

8G.add_cycle([1,2,3,4])

9G.add_edge(1,3)

10G.add_edges_from([(3,5),(3,6),(6,7)])

11nx.draw(G,node_color = 'red')

12plt.savefig("youxiangtu.png")

13plt.show

1from __future__ import division

2import matplotlib.pyplot as plt

3import networkx as nx

4

5G = nx.generators.directed.random_k_out_graph(10, 3, 0.5)

6pos = nx.layout.spring_layout(G)

7

8node_sizes = [3 + 10 * i for i in range(len(G))]

9M = G.number_of_edges

10edge_colors = range(2, M + 2)

11edge_alphas = [(5 + i) / (M + 4) for i in range(M)]

12

13nodes = nx.draw_networkx_nodes(G, pos, node_size=node_sizes, node_color='blue')

14edges = nx.draw_networkx_edges(G, pos, node_size=node_sizes, arrowstyle='->',

15 arrowsize=10, edge_color=edge_colors,

16 edge_cmap=plt.cm.Blues, width=2)

17# set alpha value for each edge

18for i in range(M):

19 edges[i].set_alpha(edge_alphas[i])

20

21ax = plt.gca

22ax.set_axis_off

23plt.savefig("directed.jpg")

24plt.show

一些精美的图例子

环形树状图

1import matplotlib.pyplot as plt

2import networkx as nx

3

4try:

5 import pygraphviz

6 from networkx.drawing.nx_agraph import graphviz_layout

7except ImportError:

8 try:

9 import pydot

10 from networkx.drawing.nx_pydot import graphviz_layout

11 except ImportError:

12 raise ImportError("This example needs Graphviz and either "

13 "PyGraphviz or pydot")

14

15G = nx.balanced_tree(3, 5)

16pos = graphviz_layout(G, prog='twopi', args='')

17plt.figure(figsize=(8, 8))

18nx.draw(G, pos, node_size=20, alpha=0.5, node_color="blue

networkx edge 属性_一文读懂Python复杂网络分析库networkx | CSDN博文精选相关推荐

  1. 一文读懂Python复杂网络分析库networkx | CSDN博文精选

    作者 | yyl424525 来源 | CSDN博客 文章目录 1. 简介 安装 支持四种图 绘制网络图基本流程 2. Graph-无向图 节点 边 属性 有向图和无向图互转 3. DiGraph-有 ...

  2. 一文读懂对抗机器学习Universal adversarial perturbations | CSDN博文精选

    作者 | Icoding_F2014 来源 | CSDN博客 本文提出一种 universal 对抗扰动,universal 是指同一个扰动加入到不同的图片中,能够使图片被分类模型误分类,而不管图片到 ...

  3. python读取枚举_一文读懂Python 枚举

    enum是一组绑定到唯一常数值的符号名称,并且具备可迭代性和可比较性的特性.我们可以使用 enum 创建具有良好定义的标识符,而不是直接使用魔法字符串或整数,也便于开发工程师的代码维护. 创建枚举 我 ...

  4. python输入什么就输出什么_一文读懂Python的输入和输出

    本文介绍了Python的输入和输出,既然是Python代码,那么就一定有输出量,那么,Python是如何输出的呢? 输出 用print()在括号中加上字符串,就可以向屏幕上输出指定的文字.比如输出'h ...

  5. python中有哪些重要的书写规则_一文读懂Python代码的书写规范

    Python代码的书写规范 1. 一致性的建议 打破一条既定规则的两个好理由 当应用这个规则将导致代码可读性下降,即使对于某人来说他已经习惯于按照这条规则来阅读代码了 为了和周围的代码保持一致而打破规 ...

  6. 读懂python语言_一文读懂python反射机制

    反射 反射机制就是在运行时,动态的确定对象的类型,并可以通过字符串调用对象属性.方法.导入模块,是一种基于字符串的事件驱动.解释型语言:程序不需要编译,程序在运行时才翻译成机器语言,每执行一次都要翻译 ...

  7. python输入什么就输出什么意思_一文读懂Python的输入和输出

    本文介绍了Python的输入和输出,既然是Python代码,那么就一定有输出量,那么,Python是如何输出的呢? 输出 用print()在括号中加上字符串,就可以向屏幕上输出指定的文字.比如输出'h ...

  8. 廖雪峰讲python高阶函数求导公式_一文读懂Python 高阶函数

    高阶函数 将函数作为参数传入,这样的函数称为高阶函数.函数式编程就是指这种高度抽象的编程范式. 变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函 ...

  9. python中的映射_一文读懂Python中的映射

    python中的反射功能是由以下四个内置函数提供:hasattr.getattr.setattr.delattr,改四个函数分别用于对对象内部执行:检查是否含有某成员.获取成员.设置成员.删除成员. ...

最新文章

  1. spring cloud微服务治理eureka、hystrix、zuul代码例子
  2. 开发ing经验关于游戏中寻路
  3. Spring MVC配置静态资源的正常访问
  4. 各个版本通道_绝地求生各个参数对画面的影响,软硬件优化帧数,拒绝做睁眼瞎...
  5. python 办公_python 让办公变得自动化
  6. Java LinkedList对象的get(int index)方法与示例
  7. 玩转linux文件描述符和重定向,玩转Linux文件描述符和重定向
  8. python makefile
  9. HDU 4679 Terrorist’s destroy
  10. 【干货】神经网络初始化trick:大神何凯明教你如何训练网络!
  11. 数据库访问优化法则详解之返回更少的数据
  12. 做自己的安卓拍照应用,其实很简单
  13. word在英文输入法的状态下,打出来的引号还是中文字符
  14. 2013-04《信息资源管理 02378》真卷解析,逐题解析+背诵技巧
  15. 视觉检测设计与实践答题卡检测实验报告
  16. HTML SWF播放器
  17. 只有浏览器显示找不到服务器dns
  18. python 期货交易接口_期货数据接口(期货数据接口 python)
  19. 数字IC-1.10 手撕代码之整数乘法和二范数(Verilog HDL数字加减法练习好帮手)
  20. 万能实体类(pageDate)

热门文章

  1. Python安装和运行
  2. 人体生物钟,24小时器官工作表
  3. 【旅游攻略】:帽儿山旅游攻略
  4. canvas 变形记——移动、旋转、缩放、变形
  5. 一篇文章带你搞定 banner 修改 SpringBoot 的默认显示模板
  6. Java前后端分离验证码处理思路
  7. C# 输入一个三位数的字符串,输出为三位数的整数,并输出百位、十位、和个位
  8. Network - 计算机网络复习总结
  9. 一文讲透云计算、大数据与人工智能三者之间的关系!
  10. Revit 2020发布