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来显示
我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了

1.创建一个Graph

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

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)

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

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值