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


简介

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

# Create graph
G = nx.Graph()

# Add nodes
G.add_node(1, label='A')
G.add_node(2, label='B')
G.add_node(3, label='C')
G.add_node(4, label='D')

# Add edges
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)

# Set node positions
pos = nx.spring_layout(G)

# Draw nodes and labels
nx.draw_networkx_nodes(G, pos)
nx.draw_networkx_labels(G, pos, labels=nx.get_node_attributes(G, 'label'))

# Draw edges with weights
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)

# Show graph
plt.axis('off')
plt.show()

输出

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

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

在添加节点后,我们将创建边来连接这些节点。为了在节点之间添加边,我们使用 add_edge() 函数。例如,节点 1 和 2 通过一个权重为 4 的边连接。

为了查看图形,我们首先需要放置节点。为了自动计算节点的位置,我们使用 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

# Create graph
G = nx.path_graph(5)

# Create subplots
fig, axs = plt.subplots(nrows=1, ncols=2, figsize=(10, 5))

# Plot original graph
axs[0].set_title('Original Graph')
nx.draw(G, ax=axs[0])

# Plot modified graph
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 可视化了图形。

更新于: 2023年7月27日

2K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告