NetworkX系列教程(1)-创建graph
⼩书匠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 _pydot import to_pydot
6. from matplotlib.font_manager import *
7.
8. #定义⾃定义字体,⽂件名从1.b查看系统中⽂字体中来,这是Linux字体路径,windows系统的字体路径⾃查
9. myfont = FontProperties(fname='/usr/share/fonts/truetype/')
10. #解决负号'-'显⽰为⽅块的问题
11. Params['axes.unicode_minus']=False
12.
13. #定义图的节点和边
14. nodes=['0','1','2','3','4','5','a','b','c']
15. 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)]
16.
17. #⽤于显⽰图⽚
18. def ShowGraph(G):
19. #使⽤pydot保存图⽚
20.    P=to_pydot(G)
21.    P.write_jpeg('pydot.png')
22.
23. #使⽤matplotlib保存图⽚
24.    pos=nx.shell_layout(G)
25.    nx.draw(G,pos,with_labels=True)
26.    plt.savefig('mat.png')
27.    plt.close()
28.
29. #将前⾯两张图显⽰
30.    plt.subplots(figsize=(12,6))
31. #plt.suptitle('Diffrent')
32. #载⼊matplotlib的图⽚
numpy教程 pdf33.    plt.subplot(1,2,1)
34.    plt.title('matplotlib')
35.    plt.imshow(Image.open('mat.png'))
36. #plt.axis('off')
37. #去掉坐标刻度
38.    icks([])
39.    icks([])
40.
41. #载⼊pydot的图⽚
42.    plt.subplot(1,2,2)
43.    plt.title('pydot')
44.    plt.imshow(Image.open('pydot.png'))
45. #plt.axis('off')
46. #去掉坐标刻度
47.    icks([])
48.    icks([])
49.
50. #显⽰图⽚
51.    plt.show()
1.2有⾃循环的⽆向图
1.3有⾃循环的有向图
1.4有⾃循环和平⾏边的⽆向图
1. #定义⽆向图
2. G = nx.Graph()
3.
4. #往图添加节点和边
5. G.add_nodes_from(nodes)
6. G.add_weighted_edges_from(edges)
7.
8. #显⽰图⽚
9.
ShowGraph(G)有⾃循环的⽆向图
1. #清除前⾯的⽆向图
2. G.clear()
3.
4. #定义有向图
5. G = nx.DiGraph()
6. #添加节点和边
7. G.add_nodes_from(nodes)
8. G.add_weighted_edges_from(edges)
9.
10. #显⽰图⽚
11.
ShowGraph(G)有⾃循环的有向图
1. #清除前⾯的⽆向图
2. G.clear()
3.
4. #定义带平⾏边⽆向图
5. G = nx.MultiGraph()
6. #添加节点和边
7. G.add_nodes_from(nodes)
8. G.add_weighted_edges_from(edges)
1.5有⾃循环和平⾏边的有向图
9.
10. #显⽰图⽚
11.
ShowGraph(G)有⾃循环和平⾏边的⽆向图
1. #清除前⾯的⽆向图
2. G.clear()
3.
4. #定义带平⾏边有向图
5. G = nx.MultiDiGraph()
6. #添加节点和边
7. G.add_nodes_from(nodes)
8. G.add_weighted_edges_from(edges)
9.
10. #显⽰图⽚
11.
ShowGraph(G)
有⾃循环和平⾏边的有向图

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。