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函数显示之前。

Python,代码示例相关视频讲解:python的or运算赋值用法用python编程Excel有没有用处?011_编程到底好玩在哪?查看python文件_输出py文件_cat_运行python文件_shelPython Matplotlib绘制网络拓扑 网络拓扑图是一种用于展示网络中各节点以及节点之间关系的图形化表现...
Graph.Editor是一款基于HTML5技术的拓补图编辑器,采用jquery插件的形式,是Qunee图形组件的扩展项目,旨在提供可供扩展的拓扑图编辑工具, 拓扑图展示、编辑、导出、保存等功能,此外本项目也是学习HTML5开发,构建WebAPP项目的参考实例。 请访问此地址查看效果:http://demo.qunee.com/editor/ 入门实例: <html&gt...
以下为Python代码:import networkx as nx import matplotlib.pyplot as pltG = nx.Graph() G.add_nodes_from([1,2,3,4,5]) G.add_edges_from([(1,2),(1,3),(2,4),(3,4),(3,5),(4,5)]) nx.draw(G, with_labels=True) pl...
使用Python绘制数据中心网络拓扑 本文采用Python语言,借助networkx, matplotlib实现三种典型数据中心网络拓扑的绘制与可视化。三种数据中心网络拓扑为Fat-tree, BCube, Vl2。 在开始之前,引入相关的包: import matplotlib.pyplot as plt import networkx as nx Fat-tree de...
G.add_edge("PC2", "Switch2") G.add_edge("Switch1", "Router1") G.add_edge("Switch2", "Router1") G.add_edge("Router1", "Router2") # 绘制网络拓扑图 nx.draw(G, with_labels=True) # 显示图像 plt.show() 运行该代码将会绘制以下网络拓扑图: ![network_topology_example](https://img-blog.csdn.net/20180424144036252) 如果数据库迁移不成功: 1 在PYcharm开发环境中删除migrations目录下的0001_initial.py类的文件 2在mysql数据库系统中,进入django_migrations的表,删除该app名字(如本文mysite1)的所有记录 use cucdate delete from django_migrations where app='mysite1'; 3 然后重新执行迁移命令
基于Django+MySQL的B/S模式云端留言系统-登录页面实现 qq_28938301: show databases;查看当前数据库中的数据仓库 create database cucdate; 创建数据仓库cucdate 开源的Python Web应用程序框架--Django qq_28938301: 确保网络状态良好,建议虚拟机中用桥接方式连网(校园网无线不可桥接)