侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

python networkx 包绘制复杂网络关系图的实现

Python  /  管理员 发布于 7年前   379

1. 创建一个图

import networkx as nxg = nx.Graph()g.clear() #将图上元素清空

所有的构建复杂网络图的操作基本都围绕这个g来执行。

2. 节点

节点的名字可以是任意数据类型的,添加一个节点是

g.add_node(1)g.add_node("a")g.add_node("spam")

添加一组节点,就是提前构建好了一个节点列表,将其一次性加进来,这跟后边加边的操作是具有一致性的。

g.add_nodes_from([2,3])or a = [2,3]g.add_nodes_from(a)

这里需要值得注意的一点是,对于add_node加一个点来说,字符串是只添加了名字为整个字符串的节点。但是对于

add_nodes_from加一组点来说,字符串表示了添加了每一个字符都代表的多个节点,exp:g.add_node("spam") #添加了一个名为spam的节点g.add_nodes_from("spam") #添加了4个节点,名为s,p,a,mg.nodes() #可以将以上5个节点打印出来看看

加一组从0开始的连续数字的节点

H = nx.path_graph(10)g.add_nodes_from(H) #将0~9加入了节点#但请勿使用g.add_node(H)

删除节点

与添加节点同理

g.remove_node(node_name)g.remove_nodes_from(nodes_list)

3. 边

边是由对应节点的名字的元组组成,加一条边

g.add_edge(1,2)e = (2,3)g.add_edge(*e) #直接g.add_edge(e)数据类型不对,*是将元组中的元素取出

加一组边

g.add_edges_from([(1,2),(1,3)])g.add_edges_from([("a","spam") , ("a",2)])

通过nx.path_graph(n)加一系列连续的边

n = 10H = nx.path_graph(n)g.add_edges_from(H.edges()) #添加了0~1,1~2 ... n-2~n-1这样的n-1条连续的边

删除边

同理添加边的操作

g.remove_edge(edge)g.remove_edges_from(edges_list)

4. 查看图上点和边的信息

g.number_of_nodes() #查看点的数量g.number_of_edges() #查看边的数量g.nodes() #返回所有点的信息(list)g.edges() #返回所有边的信息(list中每个元素是一个tuple)g.neighbors(1) #所有与1这个点相连的点的信息以列表的形式返回g[1] #查看所有与1相连的边的属性,格式输出:{0: {}, 2: {}} 表示1和0相连的边没有设置任何属性(也就是{}没有信息),同理1和2相连的边也没有任何属性

method explanation
Graph.has_node(n) Return True if the graph contains the node n.
Graph.__contains__(n) Return True if n is a node, False otherwise.
Graph.has_edge(u, v) Return True if the edge (u,v) is in the graph.
Graph.order() Return the number of nodes in the graph.
Graph.number_of_nodes() Return the number of nodes in the graph.
Graph.__len__() Return the number of nodes.
Graph.degree([nbunch, weight]) Return the degree of a node or nodes.
Graph.degree_iter([nbunch, weight]) Return an iterator for (node, degree).
Graph.size([weight]) Return the number of edges.
Graph.number_of_edges([u, v]) Return the number of edges between two nodes.
Graph.nodes_with_selfloops() Return a list of nodes with self loops.
Graph.selfloop_edges([data, default]) Return a list of selfloop edges.
Graph.number_of_selfloops() Return the number of selfloop edges.

5. 图的属性设置

为图赋予初始属性

g = nx.Graph(day="Monday") g.graph # {'day': 'Monday'}

修改图的属性

g.graph['day'] = 'Tuesday'g.graph # {'day': 'Tuesday'}

6. 点的属性设置

g.add_node('benz', money=10000, fuel="1.5L")print g.node['benz'] # {'fuel': '1.5L', 'money': 10000}print g.node['benz']['money'] # 10000print g.nodes(data=True) # data默认false就是不输出属性信息,修改为true,会将节点名字和属性信息一起输出

7. 边的属性设置

通过上文中对g[1]的介绍可知边的属性在{}中显示出来,我们可以根据这个秀改变的属性

g.clear()n = 10H = nx.path_graph(n)g.add_nodes_from(H)g.add_edges_from(H.edges())g[1][2]['color'] = 'blue'g.add_edge(1, 2, weight=4.7)g.add_edges_from([(3,4),(4,5)], color='red')g.add_edges_from([(1,2,{'color':'blue'}), (2,3,{'weight':8})])g[1][2]['weight'] = 4.7g.edge[1][2]['weight'] = 4

8. 不同类型的图(有向图Directed graphs , 重边图 Multigraphs)

Directed graphs

DG = nx.DiGraph()DG.add_weighted_edges_from([(1,2,0.5), (3,1,0.75), (1,4,0.3)]) # 添加带权值的边print DG.out_degree(1) # 打印结果:2 表示:找到1的出度print DG.out_degree(1, weight='weight') # 打印结果:0.8 表示:从1出去的边的权值和,这里权值是以weight属性值作为标准,如果你有一个money属性,那么也可以修改为weight='money',那么结果就是对money求和了print DG.successors(1) # [2,4] 表示1的后继节点有2和4print DG.predecessors(1) # [3] 表示只有一个节点3有指向1的连边

Multigraphs

简答从字面上理解就是这种复杂网络图允许你相同节点之间允许出现重边

MG=nx.MultiGraph()MG.add_weighted_edges_from([(1,2,.5), (1,2,.75), (2,3,.5)])print MG.degree(weight='weight') # {1: 1.25, 2: 1.75, 3: 0.5}GG=nx.Graph()for n,nbrs in MG.adjacency_iter(): for nbr,edict in nbrs.items():  minvalue=min([d['weight'] for d in edict.values()])  GG.add_edge(n,nbr, weight = minvalue)print nx.shortest_path(GG,1,3) # [1, 2, 3]

9.  图的遍历

g = nx.Graph()g.add_weighted_edges_from([(1,2,0.125),(1,3,0.75),(2,4,1.2),(3,4,0.375)])for n,nbrs in g.adjacency_iter(): #n表示每一个起始点,nbrs是一个字典,字典中的每一个元素包含了这个起始点连接的点和这两个点连边对应的属性 print n, nbrs for nbr,eattr in nbrs.items():  # nbr表示跟n连接的点,eattr表示这两个点连边的属性集合,这里只设置了weight,如果你还设置了color,那么就可以通过eattr['color']访问到对应的color元素  data=eattr['weight']  if data<0.5: print('(%d, %d, %.3f)' % (n,nbr,data))

10. 图生成和图上的一些操作

下方的这些操作都是在networkx包内的方法

subgraph(G, nbunch)  - induce subgraph of G on nodes in nbunchunion(G1,G2)    - graph uniondisjoint_union(G1,G2) - graph union assuming all nodes are differentcartesian_product(G1,G2) - return Cartesian product graphcompose(G1,G2)   - combine graphs identifying nodes common to bothcomplement(G)   - graph complementcreate_empty_copy(G)  - return an empty copy of the same graph classconvert_to_undirected(G) - return an undirected representation of Gconvert_to_directed(G) - return a directed representation of G

11. 图上分析

g = nx.Graph()g.add_edges_from([(1,2), (1,3)])g.add_node("spam") nx.connected_components(g) # [[1, 2, 3], ['spam']] 表示返回g上的不同连通块sorted(nx.degree(g).values()) 

通过构建权值图,可以直接快速利用dijkstra_path()接口计算最短路程

>>> G=nx.Graph()>>> e=[('a','b',0.3),('b','c',0.9),('a','c',0.5),('c','d',1.2)]>>> G.add_weighted_edges_from(e)>>> print(nx.dijkstra_path(G,'a','d'))['a', 'c', 'd']

12. 图的绘制

下面是4种图的构造方法,选择其中一个

nx.draw(g)nx.draw_random(g) #点随机分布nx.draw_circular(g) #点的分布形成一个环nx.draw_spectral(g)

最后将图形表现出来

import matplotlib.pyplot as pltplt.show()

将图片保存到下来

nx.draw(g)plt.savefig("path.png")

修改节点颜色,边的颜色

g = nx.cubical_graph()nx.draw(g, pos=nx.spectral_layout(g), nodecolor='r', edge_color='b')plt.show()

13. 图形种类的选择

Graph Type NetworkX Class
简单无向图 Graph()
简单有向图 DiGraph()
有自环 Grap(),DiGraph()
有重边 MultiGraph(), MultiDiGraph()

reference:https://networkx.github.io/documentation/networkx-1.10/reference/classes.html

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    python networkx 根据图的权重画图实现
    下一条:
    python卸载后再次安装遇到的问题解决
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 智能合约Solidity学习CryptoZombie第三课:组建僵尸军队(高级Solidity理论)(0个评论)
    • 智能合约Solidity学习CryptoZombie第二课:让你的僵尸猎食(0个评论)
    • 智能合约Solidity学习CryptoZombie第一课:生成一只你的僵尸(0个评论)
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客