❤️ Python 利用NetworkX绘制精美网络图 ❤️

简介: NetworkX 是一个用 Python 语言开发的图论与复杂网络建模工具,内置了常用的图与复杂网络分析算法,可以方便的进行复杂网络数据分析、仿真建模等工作。networkx支持创建简单无向图、有向图和多重图;内置许多标准的图论算法,节点可为任意数据;支持任意的边值维度,功能丰富。主要用于创造、操作复杂网络,以及学习复杂网络的结构、动力学及其功能。用于分析网络结构,建立网络模型,设计新的网络算法,绘制网络等等。

一、NetworkX 概述


NetworkX 是一个用 Python 语言开发的图论与复杂网络建模工具,内置了常用的图与复杂网络分析算法,可以方便的进行复杂网络数据分析、仿真建模等工作。networkx支持创建简单无向图、有向图和多重图;内置许多标准的图论算法,节点可为任意数据;支持任意的边值维度,功能丰富。主要用于创造、操作复杂网络,以及学习复杂网络的结构、动力学及其功能。用于分析网络结构,建立网络模型,设计新的网络算法,绘制网络等等。


二、NetworkX的安装


pip install networkx -i http://pypi.douban.com/simple --trusted-host pypi.douban.com


三、NetworkX基础知识


1. 创建图


可以利用 networkx 创建四种图: Graph 、DiGraph、MultiGraph、MultiDiGraph,分别为无多重边无向图、无多重边有向图、有多重边无向图、有多重边有向图。


importnetworkasnxG=nx.Graph()
G=nx.DiGraph()
G=nx.MultiGraph()
G=nx.MultiDiGraph()


2. 网络图的加点和加边


importnetworkxasnximportmatplotlib.pyplotaspltG=nx.DiGraph()
G.add_node('z')     # 添加节点zG.add_nodes_from([1, 2, 3])   # 添加节点 1 2 3G.add_edge('x', 'y')          # 添加边  起点为x  终点为yG.add_edges_from([(1, 2), (1, 3), (2, 3)])   # 添加多条边# 网络图绘制与显示nx.draw(G, with_labels=True)
plt.show()


运行效果如下:

python画图1.png


为了让网络图更美观可以调节nx.draw()方法里的参数

nx.draw(G, pos=nx.random_layout(G), node_color='b', edge_color='r', with_labels=True, font_size=18, node_size=20)
  • G:待绘制的网络图G
  • node_size:指定节点的尺寸大小(默认是300)
  • node_color: 指定节点的颜色 (可以用字符串简单标识颜色,例如’r’为红色,'g’为绿色这样)
  • node_shape: 节点的形状(默认是圆形,用字符串’o’标识)
  • alpha: 透明度 (默认是1.0,不透明,0为完全透明)
  • width: 边的宽度 (默认为1.0)
  • edge_color: 边的颜色(默认为黑色)
  • style: 边的样式(默认为实现,可选: solid | dashed | dotted | dashdot
  • with_labels:节点是否带标签
  • font_size: 节点标签字体大小
  • font_color: 节点标签字体颜色(默认为黑色)


3. 运用布局


circular_layout:节点在一个圆环上均匀分布

random_layout:节点随机分布

shell_layout:节点在同心圆上分布

spring_layout:用Fruchterman-Reingold算法排列节点(样子类似多中心放射状)

spectral_layout:根据图的拉普拉斯特征向量排列节点


绘制网络图实例如下:


importnetworkxasnximportmatplotlib.pyplotasplt# 初始化一个有向图对象DG=nx.DiGraph()
DG.add_node('X')
# 添加节点   传入列表DG.add_nodes_from(['A', 'B', 'C', 'D', 'E'])
print(f'输出图的全部节点:{DG.nodes}')
print(f'输出节点的数量:{DG.number_of_nodes()}')
# 添加边  传入列表  列表里每个元素是一个元组  元组里表示一个点指向另一个点的边DG.add_edges_from([('A', 'B'), ('A', 'C'), ('A', 'D'), ('D', 'A'), ('E', 'A'), ('E', 'D')])
DG.add_edge('X', 'C')
print(f'输出图的全部边:{DG.edges}')
print(f'输出边的数量:{DG.number_of_edges()}')
# 可自定义节点颜色colors= ['pink', 'blue', 'green', 'yellow', 'red', 'brown']
# 运用布局pos=nx.circular_layout(DG)
# 绘制网络图nx.draw(DG, pos=pos, with_labels=True, node_size=200, width=0.6, node_color=colors)
# 展示图片plt.show()


运行效果如下:

输出图的全部节点:['X', 'A', 'B', 'C', 'D', 'E']
输出节点的数量:6输出图的全部边:[('X', 'C'), ('A', 'B'), ('A', 'C'), ('A', 'D'), ('D', 'A'), ('E', 'A'), ('E', 'D')]
输出边的数量:7

python画图2.png


四、利用NetworkX实现关联类分析


利用 soccer.csv 中的数据,使用 Python 的 NetworkX 包按要求进行绘图。


python画图3.png


1. 提取数据


统计不同俱乐部(Club)的球员数量,从球员最多的五个俱乐部抽取 50 名球员信息(球员数量最多的俱乐部抽取 30 名,剩下 4 个俱乐部各抽取 5 名)构成新的 DataFrame,打印其info()。


importpandasaspddf=pd.read_csv('soccer.csv', encoding='gbk')
data=df['Club'].value_counts()
# 球员人数最多的5个俱乐部clubs=list(data.index[:5])
# 球员数量最多的俱乐部抽取30名df1=df[df['Club'] ==clubs[0]].sample(30, axis=0)
# 剩下4个俱乐部各抽取5名df2=df[df['Club'] ==clubs[1]].sample(5, axis=0)
df3=df[df['Club'] ==clubs[2]].sample(5, axis=0)
df4=df[df['Club'] ==clubs[3]].sample(5, axis=0)
df5=df[df['Club'] ==clubs[4]].sample(5, axis=0)
# 合并多个DataFrameresult=pd.concat([df1, df2, df3, df4, df5], axis=0, ignore_index=True)
# 打乱DataFrame顺序new_result=result.sample(frac=1).reset_index(drop=True)
# new_result.info()# 抽样的数据保存到excelnew_result.to_excel('samples.xlsx')


Jupyter Notebook环境中读取samples.xlsx,打印其info(),结果如下:

importpandasaspddf=pd.read_excel('samples.xlsx')
df.info()


python画图4.png


2. 画网络图


在提取出的数据的基础上,通过判断球员是否属于同一俱乐部,绘出随机分布网络图、Fruchterman-Reingold 算法排列节点网络图与同心圆分布网络图。尽可能让网络图美观,如为属于同一俱乐部的节点设置相同的颜色。


将每个球员当作网络图中一个节点,计算节点之间的连通关系,同属一个俱乐部则连通。


importpandasaspddf=pd.read_excel('samples.xlsx')
df=df.loc[::, ['Name', 'Club']]
print(df['Club'].value_counts())
datas=df.values.tolist()
name= [datas[i][0] foriinrange(len(datas))]
nodes= [str(i) foriinrange(len(datas))]
club= [datas[i][1] foriinrange(len(datas))]
# print(nodes)df=pd.DataFrame({'姓名': name, '节点编号': nodes, '所属俱乐部': club})
df.to_csv('nodes_info.csv')
withopen('record.txt', 'w') asf:
foriinrange(len(nodes)):
forjinrange(i, len(nodes) -1):
ifdatas[i][1] ==datas[j+1][1]:      # 属于同一俱乐部f.write(f'{nodes[i]}-{nodes[j+1]}-{datas[i][1]}'+'\n')


(1) 随机分布网络图


importnetworkxasnximportmatplotlib.pyplotaspltimportpandasaspdfromcollectionsimportCounterdf=pd.read_csv('nodes_info.csv')['所属俱乐部']
items=df.valuesprint(Counter(items))
node_colors= []
# 5个俱乐部   属于同一个俱乐部的节点设置相同颜色foriteminitems:
ifitem=='Free Agents':
node_colors.append('red')
elifitem=='Real Madrid':
node_colors.append('yellow')
elifitem=='Chelsea':
node_colors.append('blue')
elifitem=='FC Barcelona':
node_colors.append('green')
elifitem=='Manchester Utd':
node_colors.append('pink')
DG=nx.MultiGraph()
DG.add_nodes_from([str(i) foriinrange(0, 50)])
DG.nodes()
withopen('record.txt', 'r') asf:
con=f.read().split('\n')
edges_list= []
foriincon[:-1]:
edges_list.append(tuple(i.split('-')[:2]))
print(edges_list)
DG.add_edges_from(edges_list)
# 运用布局pos=nx.random_layout(DG)      # 节点随机分布# 绘制网络图nx.draw(DG, pos, with_labels=True, node_size=200, width=0.6, node_color=node_colors)
# 显示图片plt.show()


运行效果如下:

python画图5.png


(2) Fruchterman-Reingold 算法排列节点网络图


importnetworkxasnximportmatplotlib.pyplotaspltimportpandasaspdfromcollectionsimportCounterdf=pd.read_csv('nodes_info.csv')['所属俱乐部']
items=df.valuesprint(Counter(items))
node_colors= []
# 5个俱乐部   属于同一个俱乐部的节点设置相同颜色foriteminitems:
ifitem=='Free Agents':
node_colors.append('red')
elifitem=='Real Madrid':
node_colors.append('yellow')
elifitem=='Chelsea':
node_colors.append('blue')
elifitem=='FC Barcelona':
node_colors.append('green')
elifitem=='Manchester Utd':
node_colors.append('pink')
DG=nx.MultiGraph()
DG.add_nodes_from([str(i) foriinrange(0, 50)])
DG.nodes()
withopen('record.txt', 'r') asf:
con=f.read().split('\n')
edges_list= []
foriincon[:-1]:
edges_list.append(tuple(i.split('-')[:2]))
print(edges_list)
DG.add_edges_from(edges_list)
# 运用布局pos=nx.spring_layout(DG)      # 用Fruchterman-Reingold算法排列节点(样子类似多中心放射状)# 绘制网络图nx.draw(DG, pos, node_size=10, width=0.6, node_color=node_colors)
# 显示图片plt.show()


运行效果如下:

python画图6.png


(3) 同心圆分布网络图


importnetworkxasnximportmatplotlib.pyplotaspltimportpandasaspdfromcollectionsimportCounterdf=pd.read_csv('nodes_info.csv')['所属俱乐部']
items=df.valuesprint(Counter(items))
node_colors= []
# 5个俱乐部   属于同一个俱乐部的节点设置相同颜色foriteminitems:
ifitem=='Free Agents':
node_colors.append('red')
elifitem=='Real Madrid':
node_colors.append('yellow')
elifitem=='Chelsea':
node_colors.append('blue')
elifitem=='FC Barcelona':
node_colors.append('green')
elifitem=='Manchester Utd':
node_colors.append('pink')
DG=nx.MultiGraph()
DG.add_nodes_from([str(i) foriinrange(0, 50)])
DG.nodes()
withopen('record.txt', 'r') asf:
con=f.read().split('\n')
edges_list= []
foriincon[:-1]:
edges_list.append(tuple(i.split('-')[:2]))
print(edges_list)
DG.add_edges_from(edges_list)
# 运用布局pos=nx.shell_layout(DG)         # 节点在同心圆上分布# 绘制网络图nx.draw(DG, pos, with_labels=True, node_size=200, width=0.6, node_color=node_colors)
# 显示图片plt.show()


运行效果如下:

python画图7.png

目录
相关文章
|
1月前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
眼疾识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了4种常见的眼疾图像数据集(白内障、糖尿病性视网膜病变、青光眼和正常眼睛) 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,实现用户上传一张眼疾图片识别其名称。
103 5
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
|
2月前
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
318 55
|
3月前
|
Python
Python中的异步编程:使用asyncio和aiohttp实现高效网络请求
【10月更文挑战第34天】在Python的世界里,异步编程是提高效率的利器。本文将带你了解如何使用asyncio和aiohttp库来编写高效的网络请求代码。我们将通过一个简单的示例来展示如何利用这些工具来并发地处理多个网络请求,从而提高程序的整体性能。准备好让你的Python代码飞起来吧!
139 2
|
3月前
|
数据采集 存储 JSON
Python网络爬虫:Scrapy框架的实战应用与技巧分享
【10月更文挑战第27天】本文介绍了Python网络爬虫Scrapy框架的实战应用与技巧。首先讲解了如何创建Scrapy项目、定义爬虫、处理JSON响应、设置User-Agent和代理,以及存储爬取的数据。通过具体示例,帮助读者掌握Scrapy的核心功能和使用方法,提升数据采集效率。
169 6
|
13天前
|
安全 Linux 网络安全
利用Python脚本自动备份网络设备配置
通过本文的介绍,我们了解了如何利用Python脚本自动备份网络设备配置。该脚本使用 `paramiko`库通过SSH连接到设备,获取并保存配置文件。通过定时任务调度,可以实现定期自动备份,确保网络设备配置的安全和可用。希望这些内容能够帮助你在实际工作中实现网络设备的自动化备份。
39 14
|
2月前
|
机器学习/深度学习 人工智能 算法
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
宠物识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了37种常见的猫狗宠物种类数据集【'阿比西尼亚猫(Abyssinian)', '孟加拉猫(Bengal)', '暹罗猫(Birman)', '孟买猫(Bombay)', '英国短毛猫(British Shorthair)', '埃及猫(Egyptian Mau)', '缅因猫(Maine Coon)', '波斯猫(Persian)', '布偶猫(Ragdoll)', '俄罗斯蓝猫(Russian Blue)', '暹罗猫(Siamese)', '斯芬克斯猫(Sphynx)', '美国斗牛犬
214 29
【宠物识别系统】Python+卷积神经网络算法+深度学习+人工智能+TensorFlow+图像识别
|
2月前
|
算法 网络协议 Python
探秘Win11共享文件夹之Python网络通信算法实现
本文探讨了Win11共享文件夹背后的网络通信算法,重点介绍基于TCP的文件传输机制,并提供Python代码示例。Win11共享文件夹利用SMB协议实现局域网内的文件共享,通过TCP协议确保文件传输的完整性和可靠性。服务器端监听客户端连接请求,接收文件请求并分块发送文件内容;客户端则连接服务器、接收数据并保存为本地文件。文中通过Python代码详细展示了这一过程,帮助读者理解并优化文件共享系统。
|
2月前
|
机器学习/深度学习 人工智能 算法
深度学习入门:用Python构建你的第一个神经网络
在人工智能的海洋中,深度学习是那艘能够带你远航的船。本文将作为你的航标,引导你搭建第一个神经网络模型,让你领略深度学习的魅力。通过简单直观的语言和实例,我们将一起探索隐藏在数据背后的模式,体验从零开始创造智能系统的快感。准备好了吗?让我们启航吧!
99 3
|
3月前
|
网络安全 Python
Python网络编程小示例:生成CIDR表示的IP地址范围
本文介绍了如何使用Python生成CIDR表示的IP地址范围,通过解析CIDR字符串,将其转换为二进制形式,应用子网掩码,最终生成该CIDR块内所有可用的IP地址列表。示例代码利用了Python的`ipaddress`模块,展示了从指定CIDR表达式中提取所有IP地址的过程。
79 6
|
3月前
|
机器学习/深度学习 自然语言处理 语音技术
Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧
本文介绍了Python在深度学习领域的应用,重点讲解了神经网络的基础概念、基本结构、训练过程及优化技巧,并通过TensorFlow和PyTorch等库展示了实现神经网络的具体示例,涵盖图像识别、语音识别等多个应用场景。
103 8

热门文章

最新文章