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


Posted in Python onJuly 10, 2019

1. 创建一个图

import networkx as nx
g = 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,m
g.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 = 10
H = 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'] # 10000
print g.nodes(data=True) # data默认false就是不输出属性信息,修改为true,会将节点名字和属性信息一起输出

7. 边的属性设置

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

g.clear()
n = 10
H = 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.7
g.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和4
print 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 nbunch
union(G1,G2)    - graph union
disjoint_union(G1,G2) - graph union assuming all nodes are different
cartesian_product(G1,G2) - return Cartesian product graph
compose(G1,G2)   - combine graphs identifying nodes common to both
complement(G)   - graph complement
create_empty_copy(G)  - return an empty copy of the same graph class
convert_to_undirected(G) - return an undirected representation of G
convert_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 plt
plt.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 相关文章推荐
Python标准库之Sys模块使用详解
May 23 Python
使用Python对Access读写操作
Mar 30 Python
Python采集代理ip并判断是否可用和定时更新的方法
May 07 Python
PyCharm代码整体缩进,反向缩进的方法
Jun 25 Python
Python实现基于POS算法的区块链
Aug 07 Python
Numpy截取指定范围内的数据方法
Nov 14 Python
Django框架模板文件使用及模板文件加载顺序分析
May 23 Python
python之生产者消费者模型实现详解
Jul 27 Python
Django实现文件上传下载
Oct 06 Python
python两个_多个字典合并相加的实例代码
Dec 26 Python
python判断两个序列的成员是否一样的实例代码
Mar 01 Python
教你怎么用Python处理excel实现自动化办公
Apr 30 Python
python卸载后再次安装遇到的问题解决
Jul 10 #Python
Python求离散序列导数的示例
Jul 10 #Python
Python Matplotlib 基于networkx画关系网络图
Jul 10 #Python
我们为什么要减少Python中循环的使用
Jul 10 #Python
详解Python中的各种转义符\n\r\t
Jul 10 #Python
使用python画社交网络图实例代码
Jul 10 #Python
python 绘制拟合曲线并加指定点标识的实现
Jul 10 #Python
You might like
深入PHP FTP类的详解
2013/06/13 PHP
PHP定时更新程序设计思路分享
2014/06/10 PHP
54个提高PHP程序运行效率的方法
2015/07/19 PHP
[原创]保存的js无法执行的解决办法
2007/02/25 Javascript
jQuery动态添加的元素绑定事件处理函数代码
2011/08/02 Javascript
javascript时间函数大全
2014/06/30 Javascript
轻量级的原生js日历插件calendar.js使用指南
2015/04/28 Javascript
Angular中使用ui router实现系统权限控制及开发遇到问题
2016/09/23 Javascript
给easyui datebox扩展一个清空的实例
2016/11/09 Javascript
Bootstrap的modal拖动效果
2016/12/25 Javascript
使用nodejs下载风景壁纸
2017/02/05 NodeJs
React Native中Navigator的使用方法示例
2017/10/13 Javascript
JavaScript轮播停留效果的实现思路
2018/05/24 Javascript
详解vue移动端项目代码拆分记录
2019/03/15 Javascript
jQuery事件绑定和解绑、事件冒泡与阻止事件冒泡及弹出应用示例
2019/05/13 jQuery
JS求1到任意数之间的所有质数的方法详解
2019/05/20 Javascript
JS字符串补全方法padStart()和padEnd()
2020/05/27 Javascript
Vue实现摇一摇功能(兼容ios13.3以上)
2021/01/26 Vue.js
Python中DJANGO简单测试实例
2015/05/11 Python
详解Django通用视图中的函数包装
2015/07/21 Python
Numpy之文件存取的示例代码
2018/08/03 Python
Python字符串的常见操作实例小结
2019/04/08 Python
Mac 使用python3的matplot画图不显示的解决
2019/11/23 Python
基于Python计算圆周率pi代码实例
2020/03/25 Python
HTML5 video 上传预览图片视频如何设置、预览视频某秒的海报帧
2018/08/28 HTML / CSS
美国网上书店:Barnes & Noble
2018/08/15 全球购物
NFL官方在线商店:NFLShop
2020/07/29 全球购物
计算机科学系职业生涯规划书
2014/03/08 职场文书
医学求职信
2014/05/28 职场文书
学生不参加考试检讨书
2015/02/19 职场文书
个人年终总结范文
2015/03/09 职场文书
2015年环保局工作总结
2015/05/22 职场文书
Python数据类型最全知识总结
2021/05/31 Python
JavaScript实现简单计时器
2021/06/22 Javascript
Win11如何设置右键单击显示所有选项?Win11右键单击显示所有选项设置教程
2022/04/08 数码科技
Win11 BitLocker 驱动器加密
2022/04/19 数码科技