使用python绘制网络拓扑图-程序员宅基地

技术标签: python  

python 画网络拓扑

一个用邻接矩阵表示的网络拓扑,如何使用python代码为我们画出对应的拓扑图,并将其绘制出来。
首先,我们需要将邻接矩阵转换成 NetworkX 库中的图对象。NetworkX 是一个用于创建、操作和学习复杂网络的 Python 库,可以用于绘制各种类型的图形,包括拓扑图。首先,使用 networkx.Graph() 函数将邻接矩阵转换为无向图对象:

import networkx as nx

# 将邻接矩阵M转换成 NetworkX 图对象
G = nx.Graph(M)

然后,使用 NetworkX 库中的 draw() 函数将这个图绘制出来。在绘制过程中,先绘制节点,然后再把节点中存在的边画出来。
因此,用 draw_circular() 函数将节点绘制成一个圆形,其中with_labels=True表示每个节点都带有一个默认的数字(如,1,2,3,…)并按照邻接矩阵的连接关系将它们连接起来:

import matplotlib.pyplot as plt

# 绘制拓扑图
nx.draw_circular(G, with_labels=True)
plt.show()

完整的代码如下所示:

 import networkx as nx
import matplotlib.pyplot as plt

weight = [[0,2,3,4,5],[2,0,1,2,3],[3,1,0,3,2],[4,2,3,0,1],[5,3,2,1,0]]
G = nx.Graph()
#以下循环中代码内容实现了节点间边的添加
for i in range(len(weight)):
    for j in range(len(weight[i])):
        if weight[i][j] != 0:
            G.add_edge(i+1, j+1, weight=weight[i][j])
nx.draw_circular(G, with_labels=True)
plt.show()

运行后,拓扑图为:
在这里插入图片描述

定义拓扑中边的权重

如果需要在图的边中加上边的权重
可以通过在 nx.draw_circular() 函数中设置 edge_labels 参数来实现在拓扑图的每条边上加上权重。具体来说,需要先用 nx.get_edge_attributes() 函数获取边权重的字典形式,然后将该字典传递给 nx.draw_networkx_edge_labels() 函数来在图中显示权重标签。

以下是修改后的代码:

import networkx as nx
import matplotlib.pyplot as plt

weight = [[0,2,3,4,5],[2,0,1,2,3],[3,1,0,3,2],[4,2,3,0,1],[5,3,2,1,0]]
G = nx.Graph()
for i in range(len(weight)):
    for j in range(len(weight[i])):
        if weight[i][j] != 0:
            G.add_edge(i+1, j+1, weight=weight[i][j])

pos = nx.circular_layout(G)
edge_labels = nx.get_edge_attributes(G, 'weight')
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)
nx.draw(G, pos, with_labels=True)
plt.show()

这段代码中,nx.circular_layout() 函数用于计算节点在圆形拓扑上的位置,nx.get_edge_attributes() 函数用于获取边权重的字典形式,nx.draw_networkx_edge_labels() 函数用于在图中显示权重标签。nx.draw() 函数用于画出节点和边的拓扑图,其中 with_labels=True 参数用于显示节点标签。最后,用 plt.show() 函数显示图形。
运行后显示的图形为
在这里插入图片描述

定义节点的编号或命名

如果你想要使用自己定义的节点标签,可以将节点标签存储在列表中,并将该列表传递给 nx.draw_networkx_labels() 函数。以下是修改后的代码:

import networkx as nx
import matplotlib.pyplot as plt

weight = [[0,2,3,4,5],[2,0,1,2,3],[3,1,0,3,2],[4,2,3,0,1],[5,3,2,1,0]]
G = nx.Graph()
for i in range(len(weight)):
    for j in range(len(weight[i])):
        if weight[i][j] != 0:
            G.add_edge(i+1, j+1, weight=weight[i][j])

node_labels = ['A', 'B', 'C', 'D', 'E']
pos = nx.circular_layout(G)
edge_labels = nx.get_edge_attributes(G, 'weight')
nx.draw_networkx_labels(G, pos, labels=dict(zip(G.nodes, node_labels)))
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)
nx.draw(G, pos)
plt.show()

第一步是定义节点标签的列表 node_labels,该列表包含与每个节点相对应的自定义标签。然后,nx.draw_networkx_labels() 函数将节点标签添加到图形中。在这个函数中,labels 参数是一个字典,将节点 ID 映射到节点标签。

最后,使用 nx.draw() 函数画出节点和边的拓扑图, nx.draw_networkx_edge_labels() 函数用于在图中显示权重标签,其中 pos 参数是节点位置的字典。最后,用 plt.show() 函数显示图形。运行后的图形
在这里插入图片描述

可以制定输出的图形大小

你可以通过设置 figsize 参数来自定义 NetworkX 绘图的大小。该参数接受一个元组,包含图形的宽度和高度(以英寸为单位)。以下是修改后的代码,用于自定义拓扑大小:

import networkx as nx
import matplotlib.pyplot as plt

weight = [[0,2,3,4,5],[2,0,1,2,3],[3,1,0,3,2],[4,2,3,0,1],[5,3,2,1,0]]
G = nx.Graph()
for i in range(len(weight)):
    for j in range(len(weight[i])):
        if weight[i][j] != 0:
            G.add_edge(i+1, j+1, weight=weight[i][j])

node_labels = ['A', 'B', 'C', 'D', 'E']
pos = nx.circular_layout(G)
edge_labels = nx.get_edge_attributes(G, 'weight')

plt.figure(figsize=(8, 8))  # 设置图形大小为 8x8 英寸
nx.draw_networkx_labels(G, pos, labels=dict(zip(G.nodes, node_labels)))
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)
nx.draw(G, pos)
plt.show()

在这段代码中,我们在 plt.figure() 函数中设置 figsize 参数为 (8, 8),这意味着我们将创建一个大小为 8x8 英寸的图形。然后,我们像之前一样绘制了节点和边的拓扑图,并在图中添加了节点标签和边权重标签。最后,使用 plt.show() 函数显示图形。

把画出的图片存为文件

使用 plt.savefig() 函数将 NetworkX 绘图保存为文件。该函数需要指定文件名和文件类型,例如 .png.pdf.svg 等常见的图像格式。以下是修改后的代码,用于将 NetworkX 绘图保存为 PNG 文件:

import networkx as nx
import matplotlib.pyplot as plt

weight = [[0,2,3,4,5],[2,0,1,2,3],[3,1,0,3,2],[4,2,3,0,1],[5,3,2,1,0]]
G = nx.Graph()
for i in range(len(weight)):
    for j in range(len(weight[i])):
        if weight[i][j] != 0:
            G.add_edge(i+1, j+1, weight=weight[i][j])

node_labels = ['A', 'B', 'C', 'D', 'E']
pos = nx.circular_layout(G)
edge_labels = nx.get_edge_attributes(G, 'weight')

plt.figure(figsize=(8, 8))
nx.draw_networkx_labels(G, pos, labels=dict(zip(G.nodes, node_labels)))
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)
nx.draw(G, pos)

plt.savefig("my_graph.png")  # 将图形保存为 PNG 文件
plt.show()

在这个例子中,我们使用 plt.savefig() 函数将图形保存为 my_graph.png 文件。该函数将在当前工作目录中创建一个名为 my_graph.png 的文件,并将图形保存为 PNG 格式。在这之后,使用 plt.show() 函数显示图形,注意图形保存plt.savefig()要在show函数显示之前。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_28938301/article/details/131678154

智能推荐

FATFS文件系统详解-程序员宅基地

文章浏览阅读2.7k次,点赞13次,收藏96次。随着硬盘/flash容量不断增大,存储的数据也越来越多,早期单一的对应地址存放对应数据的方案已经无法满足我们的需求,因此一群大佬们便开始设计文件系统这样一个东西,用来管理硬盘/flash上的数据信息。本文主要分享关于FAT文件系统的详细设计。通过对FAT文件系统组成介绍,字段分析并采用新增文件实践分析的方式,详细阐述FAT文件系统的工作原理!_fatfs

【企业架构师】12 项企业架构师认证-程序员宅基地

文章浏览阅读3k次,点赞2次,收藏7次。企业架构师是使 IT 战略与业务目标保持一致的重要且不断增长的角色。无论您对云、应用程序、软件还是系统感兴趣,企业架构认证都可以提升您的职业生涯。如果您计划从事企业架构师 (EA) 的职业,那么认证是验证您的 EA 技能的好方法。作为 EA,您将负责为企业制定 IT 战略,以使业务目标与 IT 目标保持一致。公司严重依赖技术,因此 IT 现在是任何强大业务战略的基础部分。..._企业架构师认证

如何构建一个自己的代理ip池_如果制作代理ip池-程序员宅基地

文章浏览阅读5.9k次,点赞2次,收藏29次。相比前两种搭建IP池的方法来说,付费代理IP更能满足用户的需求,但对于有些特殊要求的朋友来说,他们想一次提取很多个或者多次提取很多个,存放在本地建立的IP池里,这种方法在一定的程度上优化了方案。只不过长期下来的话,服务器的维护成本较高,并且需要定时的维护,消耗大量的时间,如果是个人的话,搭建起来后期维护的成本太高了,如果您不是高端玩家的话,不建议使用这种方式搭建IP池。相对于免费的代理IP来说,收费代理IP虽然需要付出一定的成本,但是IP资源都是真实IP,并且高匿性,稳定性也好。一、默认自动切换IP。..._如果制作代理ip池

Linux下解压与压缩命令_linux解压rpm-程序员宅基地

文章浏览阅读4.3k次,点赞4次,收藏34次。本文主要是总结题主在学习与工作中使用到的Linux环境下解压与压缩命令,内容不算很全,但是囊括了大部分需求场景,如有误笔之处,还请同学指正。_linux解压rpm

前端展示后台服务器中图片的功能实现_前端访问后端图片展示-程序员宅基地

文章浏览阅读451次,点赞11次,收藏8次。这里的按钮我是放在了table表格的末尾,目的是获取每一行中的批次号,然后根据批次号读取后台服务器的图片,并且展示在前端的dialog中。有图片的效果图,这里只是做了个测试,图片的大小暂时还未调整。主要是一个接口还有个工具类,代码如下。dialog部分的代码。_前端访问后端图片展示

win10驱动开发——驱动签名_免费驱动签名-程序员宅基地

文章浏览阅读3.4k次,点赞3次,收藏11次。win1803开始直接禁用驱动强制签名的方式不行了1.设置环境bcdedit -set NOINTEGRITYCHECKS ONbcdedit -set TESTSIGNING ONbcdedit -set loadoptions DDISABLE_INTEGRITY_CHECKS2.配置环境变量找到makecert.exe文件位置如【C:\Program Files (x86)\Windows Kits\10\bin\10.0.17763.0\x64\makecert.exe】没有的请_免费驱动签名

随便推点

【二、大数据环境篇】001、方法论_方法论semma-程序员宅基地

文章浏览阅读405次。1、官网的文档无论是学习Hadoop的hdfs、hive,还是hbase等,都要非常看重官网的文档。大数据的很多框架,都是Apache的顶级项目,各个组件框架的官网链接都可以从下面的链接进入:Hadoop:http://hadoop.apache.org/Avro: 序列化系统HBase: 分布式数据库Hive: 数据仓库Mahout: 机器学习与数据挖掘库Pig: 并行计算的高级数据..._方法论semma

LDA算法的数学推导过程详解-程序员宅基地

文章浏览阅读411次,点赞8次,收藏21次。主题模型是自然语言处理和文本挖掘领域的一个重要研究方向,它可以自动发现文档集合中潜在的主题结构。其中,潜在狄利克雷分配(Latent Dirichlet Allocation, LDA)是最常用和最成功的主题模型之一。LDA是一种无监督的贝叶斯概率模型,能够有效地发现文档集合中隐藏的主题结构。LDA模型的核心思想是:每个文档可以表示为多个主题的概率分布,每个主题又可以表示为词语的概率分布。通过学习这些潜在的主题分布和词语分布,LDA模型可以发现文档集合中蕴含的语义主题信息。

Python利用fitz库提取pdf中的图片(针对多种类型pdf)_import fitz-程序员宅基地

文章浏览阅读2.3w次,点赞17次,收藏98次。目录一. 安装fitz二. pdf文件格式问题2.1 pdf文件存在多种格式2.2 分析问题三. 代码一. 安装fitz安装:需要安装fitz和PyMuPDF,否则会报如下错误:ModuleNotFoundError: No module named ‘frontend’pip install fitz PyMuPDF二. pdf文件格式问题2.1 pdf文件存在多种格式pdf文件的格式有好几种,用Adobe Acrobat比较正常的如下所示:这种类型的pdf文件可以比较正常地提取里面的图片_import fitz

for循环倒序java_for循环-程序员宅基地

文章浏览阅读5.4k次。除了while和do while循环,Java使用最广泛的是for循环。for循环的功能非常强大,它使用计数器实现循环。for循环会先初始化计数器,然后,在每次循环前检测循环条件,在每次循环后更新计数器。计数器变量通常命名为i。我们把1到100求和用for循环改写一下:// for----public class Main {public static void main(String[] arg..._java for 倒序

VS中未定义标识符cout,endl_未定义标识符 "endl-程序员宅基地

文章浏览阅读1w次,点赞6次,收藏10次。VS中未定义标识符vs2017中显示未定义标识符cout,endl。一种方法是:先看有没有包含输入输出流#include,以及命名空间using namespace std;第二种:如果上面都已包含,还是显示未定义标识符的话,检查一下,#include"pch.h"是否是在#include上面我就是犯了第二个错误..._未定义标识符 "endl

python 实现AES-CMAC算法验证_aescmac算法验证-程序员宅基地

文章浏览阅读797次,点赞7次,收藏14次。如果你也是看准了Python,想自学Python,在这里为大家准备了丰厚的免费。_aescmac算法验证

推荐文章

热门文章

相关标签