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 可视化了图形。