硬核教程,利用 Python 搞定精美网络图!

Python引文网络:构建和分析网络结构的工具 本文介绍了几个常用的Python库,包括NetworkX、Gephi库和Network Analysis Library,它们提供了丰富的功能,可以帮助您构建和分析引文网络。通过这些工具,您可以创建网络、添加节点和边,导出网络数据以进行进一步的可视化和分析,以及计算网络中的节点中心性等指标。在本文中,我们将介绍几个常用的Python库,这些库可以帮助您创建、操作和分析引文网络。在上面的示例中,我们首先创建了一个空的有向图,然后添加了三个论文节点,并通过添加边来表示它们之间的引用关系。 阅读详情

作者:叶庭云

编辑:Lemon

出品:Python数据之道

硬核教程,

利用 Python 搞定精美网络图!

一、NetworkX 概述

NetworkX 是一个用 Python 语言开发的图论与复杂网络建模工具,内置了常用的图与复杂网络分析算法,可以方便的进行复杂网络数据分析、仿真建模等工作。

Networkx 支持创建简单无向图、有向图和多重图;内置许多标准的图论算法,节点可为任意数据;支持任意的边值维度,功能丰富。主要用于创造、操作复杂网络,以及学习复杂网络的结构、动力学及其功能。用于分析网络结构,建立网络模型,设计新的网络算法,绘制网络等等。

PS:本文所使用的数据源以及代码文件,可以在文末获取

二、NetworkX 的安装

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

三、NetworkX 基础知识

1. 创建图

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

import network as nx
G = nx.Graph()
G = nx.DiGraph()
G = nx.MultiGraph()
G = nx.MultiDiGraph()

2. 网络图的加点和加边

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

运行效果如下:

为了让网络图更美观可以调节 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:根据图的拉普拉斯特征向量排列节点

绘制网络图实例如下:

import networkx as nx
import matplotlib.pyplot as plt
# 初始化一个有向图对象
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

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

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

1. 提取数据

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

import pandas as pd
df = 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)
# 合并多个DataFrame
result = 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()
# 抽样的数据保存到excel
new_result.to_excel('samples.xlsx')

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

import pandas as pd
df = pd.read_excel('samples.xlsx')
df.info()

2. 画网络图

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

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

import pandas as pd
df = pd.read_excel('samples.xlsx')
df = df.loc[::, ['Name', 'Club']]
print(df['Club'].value_counts())
datas = df.values.tolist()
name = [datas[i][0] for i in range(len(datas))]
nodes = [str(i) for i in range(len(datas))]
club = [datas[i][1] for i in range(len(datas))]
# print(nodes)
df = pd.DataFrame({'姓名': name, '节点编号': nodes, '所属俱乐部': club})
df.to_csv('nodes_info.csv')
with open('record.txt', 'w') as f:
for i in range(len(nodes)):
for j in range(i, len(nodes) - 1):
if datas[i][1] == datas[j+1][1]:      # 属于同一俱乐部
                f.write(f'{nodes[i]}-{nodes[j + 1]}-{datas[i][1]}'+ '\n')
(1) 随机分布网络图
import networkx as nx
import matplotlib.pyplot as plt
import pandas as pd
from collections importCounter
df = pd.read_csv('nodes_info.csv')['所属俱乐部']
items = df.values
print(Counter(items))
node_colors = []
# 5个俱乐部   属于同一个俱乐部的节点设置相同颜色
for item in items:
if item == 'Free Agents':
        node_colors.append('red')
elif item == 'Real Madrid':
        node_colors.append('yellow')
elif item == 'Chelsea':
        node_colors.append('blue')
elif item == 'FC Barcelona':
        node_colors.append('green')
elif item == 'Manchester Utd':
        node_colors.append('pink')
DG = nx.MultiGraph()
DG.add_nodes_from([str(i) for i in range(0, 50)])
DG.nodes()
with open('record.txt', 'r') as f:
    con = f.read().split('\n')
edges_list = []
for i in con[:-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()

运行效果如下:

(2) Fruchterman-Reingold 算法排列节点网络图
import networkx as nx
import matplotlib.pyplot as plt
import pandas as pd
from collections importCounter
df = pd.read_csv('nodes_info.csv')['所属俱乐部']
items = df.values
print(Counter(items))
node_colors = []
# 5个俱乐部   属于同一个俱乐部的节点设置相同颜色
for item in items:
if item == 'Free Agents':
        node_colors.append('red')
elif item == 'Real Madrid':
        node_colors.append('yellow')
elif item == 'Chelsea':
        node_colors.append('blue')
elif item == 'FC Barcelona':
        node_colors.append('green')
elif item == 'Manchester Utd':
        node_colors.append('pink')
DG = nx.MultiGraph()
DG.add_nodes_from([str(i) for i in range(0, 50)])
DG.nodes()
with open('record.txt', 'r') as f:
    con = f.read().split('\n')
edges_list = []
for i in con[:-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()

运行效果如下:

(3) 同心圆分布网络图
import networkx as nx
import matplotlib.pyplot as plt
import pandas as pd
from collections importCounter
df = pd.read_csv('nodes_info.csv')['所属俱乐部']
items = df.values
print(Counter(items))
node_colors = []
# 5个俱乐部   属于同一个俱乐部的节点设置相同颜色
for item in items:
if item == 'Free Agents':
        node_colors.append('red')
elif item == 'Real Madrid':
        node_colors.append('yellow')
elif item == 'Chelsea':
        node_colors.append('blue')
elif item == 'FC Barcelona':
        node_colors.append('green')
elif item == 'Manchester Utd':
        node_colors.append('pink')
DG = nx.MultiGraph()
DG.add_nodes_from([str(i) for i in range(0, 50)])
DG.nodes()
with open('record.txt', 'r') as f:
    con = f.read().split('\n')
edges_list = []
for i in con[:-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()

运行效果如下:

作者简介

叶庭云

个人格言: 热爱可抵岁月漫长

优快云博客: https://blog.youkuaiyun.com/fyfugoyfa/

---------End---------

“分享”和“在看”是更好的支持!

Python教程之 Python 中创建网络图 网络图(或图表)对于可视化实体之间的连接很有用。例如,地铁地图是最常遇到的网络图之一。节点是要可视化的数据中的标签。这些节点之间的关系由线条表示。因此,要可视化的数据必须采用包含节点信息和“从-到”数据的格式。让我们生成虚拟数据来可视化。 我创建了 9 个虚拟节点,给每个节点一个字母。draw_number函数确定一个随机索引。根据这些索引,我们从节点列表中选择字母并将它们添加到from或to列表中。我们总共有 20 个连接。 对于可视化,我们将使用networkx和plotly库。 导入库后,我要做的第一 阅读详情

相关推荐

使用Python绘制无向/有向图形的基本属性、图形读写及绘制详解

本文介绍了如何使用NetworkX创建无向/有向图形,并提供了相关的源代码示例。此外,还介绍了如何读取和写入图形文件。使用NetworkX,可以轻松地创建、操作和研究复杂的网络结构,并提供丰富的数据分析和可视化功能。

学习使你进步。 690

python画有权重网络图,在python中的networkx图中查找最大加权边

I want to find 'n' maximum weighted edges in a networkx graph. How can it be achieved. I have constructed a graph as follows :g_test = nx.from_pandas_edgelist(new_df, 'number', 'contactNumber', edge_a...

weixin_39860732的博客 494

从零搭建企业网络:使用Packet Tracer模拟多区域OSPF组网全过程

本文通过Cisco Packet Tracer模拟,详细演示了从零搭建一个典型企业多区域OSPF网络的完整流程。内容涵盖网络拓扑规划、IP地址设计、多区域划分原理,并提供了从设备初始化、接口配置到OSPF多区域核心配置与验证的详细步骤。文章旨在帮助网络学习者与IT支持人员通过动手实验,将理论知识转化为实际的配置与排障能力。

day7的博客 1032

python做网络图_硬核教程,利用 Python 搞定精美网络图!

硬核教程,利用 Python 搞定精美网络图!一、NetworkX 概述NetworkX 是一个用 Python 语言开发的图论与复杂网络建模工具,内置了常用的图与复杂网络分析算法,可以方便的进行复杂网络数据分析、仿真建模等工作。Networkx 支持创建简单无向图、有向图和多重图;内置许多标准的图论算法,节点可为任意数据;支持任意的边值维度,功能丰富。主要用于创造、操作复杂网络,以及学习复杂网络...

weixin_39777018的博客 1059

在Ubuntu 20.04上,用EtherCAT Igh 1.6.2驱动高创BD3E伺服电机(附完整C代码)

本文详细介绍了在Ubuntu 20.04实时内核环境下,使用EtherCAT Igh 1.6.2主站驱动高创BD3E伺服电机的完整实现方案。从实时系统配置、伺服电机PDO映射到精确控制线程设计,提供了完整的C代码样例和实际项目中的调试技巧,帮助开发者实现工业自动化中的高精度运动控制。

weixin_30772105的博客 112

IFIX5.8在Win10系统下的安装避坑指南

本文提供了IFIX5.8在Windows 10系统下的详细安装教程与避坑指南。针对常见的驱动缺失、UAC拦截及兼容性报错等问题,文章从安装前准备、分步安装流程到安装后配置与驱动修复,给出了系统性的解决方案,帮助工控从业者顺利完成部署。

f6g7h8i9j的博客 364

python中判断无向图是否有环_硬核教程,利用 Python 搞定精美网络图!

硬核教程,利用 Python 搞定精美网络图!一、NetworkX 概述NetworkX 是一个用 Python 语言开发的图论与复杂网络建模工具,内置了常用的图与复杂网络分析算法,可以方便的进行复杂网络数据分析、仿真建模等工作。Networkx 支持创建简单无向图、有向图和多重图;内置许多标准的图论算法,节点可为任意数据;支持任意的边值维度,功能丰富。主要用于创造、操作复杂网络,以及学习复杂网络...

weixin_39654619的博客 770

IDEA 2023.2最新破解安装教程(含详细配置步骤及常见问题解决)

本文详细介绍了IDEA 2023.2的安装流程及高效开发环境搭建指南,涵盖基础配置、项目结构优化、核心功能使用、插件推荐、性能优化等全方位内容,帮助开发者快速掌握这一强大的Java开发工具。

x2y3z4a5b的博客 1755

python画圆形螺旋线_硬核教程,利用 Python 搞定精美网络图!

硬核教程,利用 Python搞定精美网络图!一、NetworkX 概述NetworkX 是一个用 Python 语言开发的图论与复杂网络建模工具,内置了常用的图与复杂网络分析算法,可以方便的进行复杂网络数据分析、仿真建模等工作。Networkx 支持创建简单无向图、有向图和多重图;内置许多标准的图论算法,节点可为任意数据;支持任意的边值维度,功能丰富。主要用于创造、操作复杂网络,以及学...

weixin_39820997的博客 996

FMCW雷达基本原理(通俗易懂)篇2

FMCW雷达(Frequency Modulated Continuous Wave Radar)是一种使用频率调制连续波的雷达系统。它使用一个发射器发射一个连续波,但是这个连续波的频率会在一定的范围内不断变化。当这个连续波遇到一个目标物体并被反射回来时,接收器会检测到这个反射波的频率变化,并计算出目标物体的距离和速度等信息。FMCW雷达的原理可以理解为:1.发射器发射一个连续波,这个波的频率会从一个固定的起始频率开始,逐渐变化至一个固定的终止频率。

研二小学鸡的博客 7694

LangChain + Milvus Lite:从零搭建本地RAG知识库

本文详细介绍了如何利用LangChain、Milvus Lite和gte-large-zh模型,在本地从零搭建一个完整的RAG知识库系统。文章涵盖了环境配置、文档处理与向量化、本地向量库构建以及检索问答实现的全流程,重点突出了完全本地化部署带来的数据隐私安全和成本优势,为开发者提供了一条实践性极强的技术路径。

weixin_29044713的博客 445

硬核教程,利用 Python 搞定精美网络图

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

weixin_44386638的博客 400

【unity实战】Unity2D TileMap的探究(最简单,最全面的TileMap使用介绍)

之前有人在微信上找我,问了TileMap相关的知识【unity实战】随机地下城生成2——绘制地图Tilemap的使用及一些技巧的使用(含源码)不过写的不是特别不是特别细致,只是简单的用了一下,所有这次特地打算单独写一篇文章,来介绍一下,下次还有人问我,我直接就把这篇文章丢给他,完美!Unity的Tilemap 一般称之为瓦片地图或者平铺地图,是 Unity2017 中新增的功能,主要用于快速编辑 2D 游戏中的场景,通过复用资源的形式提升地图多样性。Tilemap是一个用于创建2D地图的工具。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1万+

【Python】Python爬虫快速入门,BeautifulSoup基本使用及实践

来源:Python数据之道作者:Peter整理:阳哥爬虫,是学习Python的一个有用的分支,互联网时代,信息浩瀚如海,如果能够便捷的获取有用的信息,我们便有可能领先一步,而爬虫正是这样的...

fengdu78的博客 555

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Python爬虫快速入门,BeautifulSoup基本使用及实践

来源:Python数据之道作者:Peter整理:阳哥大家好,我是阳哥。今天来跟大家分享用 BeautifulSoup 获取信息的一些知识点,文章内容由公众号读者 Peter 创作。欢迎各位...

Python数据之道 1142

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

python画有权重网络图_netgraph一个Python模块来制作中等大小(10-100个节点)的加权有向图...

netgraphPython module to make publication quality plots of weighted, directed graphs of medium size (10-100 nodes). Unweighted, undirected graphs will look perfectly fine, too. The node positions can ...

weixin_39586683的博客 846

python 画网络图

1111

MusicDancing的博客 1227

用python画关系网络图-使用Python的networkx绘制精美网络图教程

最近因为数学建模3天速成Python,然后做了一道网络的题,要画网络图。在网上找了一些,发现都是一些很基础的丑陋红点图,并且关于网络的一些算法也没有讲,于是自己进http://networkx.github.io/学习了一下。以下仅博主自己的总结,勿认真,有错误尽情指出,大家一起交流。需要用到的module malplotlib.pyplot 和networkx正文:一、malplotlib和ne...

weixin_37988176的博客 6123

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

1. 创建一个图import networkx as nxg = nx.Graph()g.clear() #将图上元素清空所有的构建复杂网络图的操作基本都围绕这个g来执行。2. 节点节点的名字可以是任意数据类型的,添加一个节点是g.add_node(1)g.add_node("a")g.add_node("spam")添加一组节点,就是提前构建好了一个节点列...

weixin_37988176的博客 3817

运筹学——图论与最短距离(Python实现)

目录 1 概述 1.1 贪心算法 1.2 图论及求解最短距离 1.2.1 方法选择: 1.2.2狄克斯屈拉(Dijkstra)算法 2 案例1——贪心算法实现 2.1 旅行商问题(TSP) 2.2 案例 2.3 Python实现 2.4 结果 3 案例2——图论及最短距离 3.1 知识点 3.2networkx绘图 3.2.1创建图 3.2.2定点的添加、删除和查看 3.2.3 边的添加、删除和查看 3.3 案例 3.4 Python实现 3...

weixin_46039719的博客 4484

Python科学计算:多维图像绘制

绘图学习

faltas的博客 1122

networkx 画图布局

举例 import networkx as nx import matplotlib.pyplot as plt 我们先通过nx.erdos_renyi_graph(10, 0.15)方法随机生成图像 er = nx.erdos_renyi_graph(10, 0.15) nx.draw(er,node_size=300,with_labels = True,pos = nx.spring_layout(er),node_color = 'r') pos常用自动布局函数 上图是由nx.draw(),核

pylittlebrat的博客 1万+

【算法】python实现无向图中是否存在环判断

一、判断给定的“无向图”是不是”无环图“ 首先在这里我们假设不存在自环与平行边)。同时定义边数为m,顶点为n;,且分为两种情况讨论。 m>n时,则无向图必有环 m<n时, 第一步:删除所有度<=1的顶点及相关的边,并将另外与这些边相关的其它顶点的度减一。 # 第二步:将度数变为1的顶点排入队列,并从该队列中取出一个顶点重复步骤一。如果最后还有未删除顶点,则存在环,否则没有环 # -*- coding: utf-8 -*- # /usr/bin/python # 作者:kimicr #

qq_32643313的博客 2541

Python之networkx绘制网络图

注意:首先要引入库pylab。

whY的笔记 2217
上一篇: 肝!打造一款高逼格的Vim神器
下一篇: Python正则表达式,从入门到实战,精华都在这里!
Wang_AI
博客等级 码龄12年 997粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值