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

发布时间 2023-07-30 22:03:43作者: 很酷的站长

介绍

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()' 函数调用用于显示构建的图。根据运行脚本的条件。

最终,程序将图表存储为名为“文件名.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 通过四加权边连接。

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

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

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

最后,我们使用 plt.show() 显示图形图。这将打开一个窗口或在 Jupyter 笔记本界面中显示绘图。为了使绘图看起来更干净并专注于图形本身,我们使用 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可视化了图形。