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