zoukankan      html  css  js  c++  java
  • 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 例子图

    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.  
    8. #定义自定义字体,文件名从1.b查看系统中文字体中来,这是Linux字体路径,windows系统的字体路径自查 
    9. myfont = FontProperties(fname='/usr/share/fonts/truetype/wqy/wqy-zenhei.ttc')  
    10. #解决负号'-'显示为方块的问题  
    11. matplotlib.rcParams['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的图片 
    33. plt.subplot(1,2,1) 
    34. plt.title('matplotlib') 
    35. plt.imshow(Image.open('mat.png')) 
    36. #plt.axis('off') 
    37. #去掉坐标刻度 
    38. plt.xticks([]) 
    39. plt.yticks([]) 
    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. plt.xticks([]) 
    48. plt.yticks([]) 
    49.  
    50. #显示图片 
    51. plt.show()  

    1.2有自循环的无向图

    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) 

    png
    有自循环的无向图

    1.3有自循环的有向图

    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) 

    png
    有自循环的有向图

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

    1. #清除前面的无向图 
    2. G.clear() 
    3.  
    4. #定义带平行边无向图 
    5. G = nx.MultiGraph() 
    6. #添加节点和边 
    7. G.add_nodes_from(nodes) 
    8. G.add_weighted_edges_from(edges) 
    9.  
    10. #显示图片 
    11. ShowGraph(G) 

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

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

    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) 

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

  • 相关阅读:
    读书笔记_Effective_C++_条款十:令operator=返回一个reference to *this
    读书笔记_Effective_C++_条款九:绝不在构造和析构函数中调用virtual函数
    读书笔记_Effective_C++_条款七:为多态基类声明virtual析构函数
    读书笔记_Effective_C++_条款十二:复制对象时勿忘其每一个成分
    读书笔记_Effective_C++_条款八:别让异常逃离析构函数
    创建django project及app中的若干问题
    python一些小知识
    python小专题——JSON
    python小专题——optparse模块
    初窥JQuery(一)选择符 【转】
  • 原文地址:https://www.cnblogs.com/wushaogui/p/9199726.html
Copyright © 2011-2022 走看看