❤️ 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

目录
相关文章
|
3月前
|
运维 监控 数据可视化
Python 网络请求架构——统一 SOCKS5 接入与配置管理
通过统一接入端点与标准化认证,集中管理配置、连接策略及监控,实现跨技术栈的一致性网络出口,提升系统稳定性、可维护性与可观测性。
|
6月前
|
机器学习/深度学习 算法 量子技术
GQNN框架:让Python开发者轻松构建量子神经网络
为降低量子神经网络的研发门槛并提升其实用性,本文介绍一个名为GQNN(Generalized Quantum Neural Network)的Python开发框架。
153 4
GQNN框架:让Python开发者轻松构建量子神经网络
|
3月前
|
机器学习/深度学习 大数据 关系型数据库
基于python大数据的青少年网络使用情况分析及预测系统
本研究基于Python大数据技术,构建青少年网络行为分析系统,旨在破解现有防沉迷模式下用户画像模糊、预警滞后等难题。通过整合多平台亿级数据,运用机器学习实现精准行为预测与实时干预,推动数字治理向“数据驱动”转型,为家庭、学校及政府提供科学决策支持,助力青少年健康上网。
|
4月前
|
JavaScript Java 大数据
基于python的网络课程在线学习交流系统
本研究聚焦网络课程在线学习交流系统,从社会、技术、教育三方面探讨其发展背景与意义。系统借助Java、Spring Boot、MySQL、Vue等技术实现,融合云计算、大数据与人工智能,推动教育公平与教学模式创新,具有重要理论价值与实践意义。
|
5月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
361 18
|
机器学习/深度学习 人工智能 算法
猫狗宠物识别系统Python+TensorFlow+人工智能+深度学习+卷积网络算法
宠物识别系统使用Python和TensorFlow搭建卷积神经网络,基于37种常见猫狗数据集训练高精度模型,并保存为h5格式。通过Django框架搭建Web平台,用户上传宠物图片即可识别其名称,提供便捷的宠物识别服务。
1139 55
|
6月前
|
JSON 网络安全 数据格式
Python网络请求库requests使用详述
总结来说,`requests`库非常适用于需要快速、简易、可靠进行HTTP请求的应用场景,它的简洁性让开发者避免繁琐的网络代码而专注于交互逻辑本身。通过上述方式,你可以利用 `requests`处理大部分常见的HTTP请求需求。
605 51
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
眼疾识别系统,本系统使用Python作为主要开发语言,基于TensorFlow搭建卷积神经网络算法,并收集了4种常见的眼疾图像数据集(白内障、糖尿病性视网膜病变、青光眼和正常眼睛) 再使用通过搭建的算法模型对数据集进行训练得到一个识别精度较高的模型,然后保存为为本地h5格式文件。最后使用Django框架搭建了一个Web网页平台可视化操作界面,实现用户上传一张眼疾图片识别其名称。
600 5
基于Python深度学习的眼疾识别系统实现~人工智能+卷积网络算法
|
5月前
|
数据采集 存储 数据可视化
Python网络爬虫在环境保护中的应用:污染源监测数据抓取与分析
在环保领域,数据是决策基础,但分散在多个平台,获取困难。Python网络爬虫技术灵活高效,可自动化抓取空气质量、水质、污染源等数据,实现多平台整合、实时更新、结构化存储与异常预警。本文详解爬虫实战应用,涵盖技术选型、代码实现、反爬策略与数据分析,助力环保数据高效利用。
354 0
|
6月前
|
存储 监控 算法
基于 Python 跳表算法的局域网网络监控软件动态数据索引优化策略研究
局域网网络监控软件需高效处理终端行为数据,跳表作为一种基于概率平衡的动态数据结构,具备高效的插入、删除与查询性能(平均时间复杂度为O(log n)),适用于高频数据写入和随机查询场景。本文深入解析跳表原理,探讨其在局域网监控中的适配性,并提供基于Python的完整实现方案,优化终端会话管理,提升系统响应性能。
195 4

热门文章

最新文章

推荐镜像

更多