Python - 使用 Matplotlib 可视化 NetworkX 中生成的图形

pythonserver side programmingprogramming更新于 2024/1/11 14:17:00

简介

Python 是一种灵活的编码语言,以其易用性和清晰性而闻名。它提供了许多库和组件来简化不同的任务,包括创建图形和显示。NetworkX 是一个高效的 Python 工具包,用于构建、更改和研究复杂网络的排列、移动和操作。然而,Matplotlib 是一个流行的工具包,用于在 Python 中创建静态、动画和交互式可视化。

定义

NetworkX 是一个 Python 库,用于构建、修改和研究复杂网络的排列、移动和功能。它提供了多种功能和数学公式来生成各种图形表示。这包括有向和无向网络、多向图和两部分图。

Matplotlib 提供了广泛的功能来使用 Python 生成静态、动态和交互式图。这为可视化数据提供了许多功能,例如线图、散点图、条形图、直方图等。

语法

import networkx as nx
import matplotlib.pyplot as plt
G = nx.Graph()
G.add_edge(1, 2)
G.add_edge(2, 3)
nx.draw(G)
plt.show()
plt.savefig("filename.png")

程序的初始阶段需要导入基本模块 `networkx` 和 `matplotlib.pyplot`。然后,使用 `networkx` 库中的 `Graph()` 子例程创建一个空白图形变量 `G`。

为了定义图表的布局,通过`add_edge()`函数放置两条连接线。

一旦定义完成图表的结构,程序将继续使用`networkx`框架中的`draw()`函数可视化图表。`draw()`方法接收图表`G`作为变量并生成网络的可视输出。默认情况下,函数`draw()`采用弹簧放置算法来放置元素。它显示具有预设视觉特征的图。

库'matplotlib.pyplot'中的'show()'函数调用用于显示构建的图。根据运行脚本的条件。

最终,程序将图表存储为名为"filename.png"的图片文件。它采用`matplotlib.pyplot`框架中的`savefig()`过程。此功能允许用户定义文件名和格式(如 PNG、JPEG、PDF)来存储图表。在这种情况下,图表将保存为 PNG 格式的图片,标题为"filetitle.png"。该文档将保存在与 Python 脚本或笔记本相同的文件夹中。

算法

  • 步骤 1:导入所需的库:networkx 和 matplotlib.pyplot。

  • 步骤 2:使用 NetworkX 生成图形。

  • 步骤 3:使用 Matplotlib 绘制图形。

  • 步骤 4:将图形的绘制保存在文件中。

  • 步骤 5:显示图形的绘制。

方法

  • 方法 1:使用节点标签和边权重可视化图形

  • 方法 2:使用可视化大型图形子图

方法 1:使用节点标签和边权重可视化图形

示例

import networkx as nx
import matplotlib.pyplot as plt

# 创建图形
G = nx.Graph()

# 添加节点
G.add_node(1, label='A')
G.add_node(2, label='B')
G.add_node(3, label='C')
G.add_node(4, label='D')

# 添加边
G.add_edge(1, 2, weight=4)
G.add_edge(2, 3, weight=7)
G.add_edge(3, 1, weight=2)
G.add_edge(1, 4, weight=5)

# 设置节点位置
pos = nx.spring_layout(G)

# 绘制节点和标签
nx.draw_networkx_nodes(G, pos)
nx.draw_networkx_labels(G, pos, labels=nx.get_node_attributes(G, 'label'))

# 绘制带权重的边
edge_labels = nx.get_edge_attributes(G, 'weight')
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)
nx.draw_networkx_edges(G, pos)

# 显示图形
plt.axis('off')
plt.show()

输出

我们使用 NetworkX 中的 Graph() 函数创建一个名为 G 的空图形对象。

现在是时候用节点填充我们的图形了。要将单个节点添加到图中,我们使用 add_node() 函数。每个节点都被赋予一个唯一的标识,我们还可以通过使用自定义属性为节点提供标签。在此示例中,我们将节点 1 标记为"A",节点 2 标记为"B",节点 3 标记为"C",节点 4 标记为"D"。

添加节点后,我们将开发边来连接它们。要在节点之间添加边,我们使用 add_edge() 函数。例如,节点 1 和 2 由四权重边连接。

要查看图形,我们必须首先定位节点。要自动计算节点的位置,我们使用 NetworkX 的 spring_layout() 方法。此函数应用一种算法,尝试以美观的方式排列节点。

现在到了令人兴奋的部分 - 可视化图形!我们使用各种 NetworkX 函数和 Matplotlib 来创建图。我们首先使用 draw_networkx_nodes() 绘制节点,使用 draw_networkx_labels() 绘制标签。我们传入图形对象 G 和我们之前计算的位置 pos。这可确保节点和标签显示在正确的位置。

为了可视化边缘,我们还使用 draw_networkx_edges() 函数绘制它们。此外,我们使用 draw_networkx_edge_labels() 函数包含边缘权重。此函数将边缘权重作为标签添加到相应边缘附近。

最后,我们使用 plt.show() 显示图形图。这将打开一个窗口或在 Jupyter Notebook 界面中显示该图。为了使图看起来更清晰并专注于图形本身,我们使用 plt.axis('off') 关闭轴的可见性。

方法 2:使用子图可视化大型图形

示例

import networkx as nx
import matplotlib.pyplot as plt

# 创建图表
G = nx.path_graph(5)

# 创建子图
fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(10, 5))

# 绘制原始图表
axs[0].set_title('Original Graph')
nx.draw(G, ax=axs[0])

# 绘制修改后的图表
axs[1].set_title('Modified Graph')
pos = nx.spring_layout(G)
nx.draw(G, pos=pos, ax=axs[1], node_color='r', node_size=500, with_labels=False)
plt.suptitle('Visualization of Large Graph with Subplots')
plt.show()

输出

首先,我们导入必要的库:NetworkX 和 Matplotlib.pyplot。这些库为我们提供了创建和可视化图形的函数和工具。

接下来,我们使用 NetworkX 中的 path_graph() 函数创建一个名为 G 的图形对象。此函数生成一个简单的路径图,其中 5 个节点以线性方式连接。

为了组织可视化,我们使用 Matplotlib 的 subplots() 方法来构建子图。我们指出子图的行数和列数(在本例中为一行和两列),以及图形大小。

这有助于我们将绘图区域划分为多个部分以显示不同的图形。

现在,是时候在第一个子图上绘制原始图形了。我们使用索引 0 访问第一个子图,并使用 set_title() 函数设置其标题。然后,我们使用 NetworkX 中的 draw() 函数在此子图上可视化原始图形。

转到第二个子图,我们重复该过程。我们设置其标题并使用索引 1 访问它。我们还使用 NetworkX 中的 spring_layout() 函数计算节点位置,该函数以美观的方式排列节点。然后,我们再次使用 draw() 函数在此子图上可视化修改后的图形。在这里,我们可以自定义节点颜色、大小和标签以将其与原始图形区分开来。

为了增强整体呈现效果,我们使用 Matplotlib 中的 suptitle() 函数为整个图形添加一个通用标题。

结论

通过此,我们正确了解了这些主题。我们已成功创建图表、设置子图并使用 NetworkX 和 Matplotlib 对图表进行可视化。


相关文章