什么是图
图是由节点(也称为顶点)和边组成的数据结构。节点表示图中的实体,边表示实体之间的关系或连接。
图可用于对各种现实世界问题进行建模,例如社交网络、交通系统和计算机网络等。
有向图是边有方向的图。这意味着边仅沿特定方向从一个节点到达另一个节点。
相反,无向图没有方向,边可以以任何方向从一个节点到另一个节点。
最后,多重图是在相同的两个节点之间可以具有多条边的图。
初体验
库的安装
可以使用 pip 来安装 NetworkX。
pip install networkx
安装完 NetworkX 后,你就可以开始在 Jupyter Notebook 中使用它。
首先,你需要导入 networkx 和 matplotlib 包,它们用于绘制和可视化图形。
下面是如何使用 NetworkX 创建简单图形,并使用 matplotlib 绘制它的示例。
示例
在此示例中,我们首先使用 import 语句导入 networkx 和 matplotlib 包。
然后,我们使用 NetworkX 的 Graph 类创建一个空图。
我们使用 add_node() 函数添加 ID 为 1 和 2 的两个节点,并使用 add_edge() 函数在它们之间添加一条边。
最后,我们使用 NetworkX 的 draw() 函数绘制带有标签的图形,并使用 matplotlib 的 show() 函数实际显示它。
正如你所看到的,Graph 创建了一个无向图。
import random
import networkx as nx
G = nx.Graph()
G.add_node('1')
G.add_node('2')
G.add_edge('1','2')
nx.draw(G,with_labels=True)
当然,networkx 的主要目的不是绘制如此简单的图表。相反,networkx 的真正强大之处在于分析图表。
例如,我们可以轻松找到两个给定节点之间的最短路径。
为了说明这一点,我们将创建一个更大的随机图表。
# Create a random graph of 100 nodes:
num_nodes = 100
G = nx.Graph()
G.add_nodes_from(range(num_nodes))
# Give each node an edge to two other nodes, randomly chosen
for i in range(num_nodes):
G.add_edge(i, random.randint(0, num_nodes-1))
G.add_edge(i, random.randint(0, num_nodes-1))
# We are looking for the shortest distance from node 0 to node 99.
# Paint node 0 red and node 99 green.
color_map = ["gray"] * num_nodes
color_map[0] = "red"
color_map[-1] = "green"
nx.draw(G, node_color=color_map, with_labels=True)
此代码示例创建了一个包含 100 个节点和节点之间的边的随机图。
它使用 Python 标准库中的 random 模块,通过随机选择两个节点来添加边。
然后,根据节点是起始节点(红色)还是结束节点(绿色)来分配节点的颜色。这是通过创建 color_map 列表来完成的,其中每个元素对应于图中的一个节点。color_map 列表的第一个元素设置为“red”,对应于起始节点,最后一个元素设置为“green”,对应于结束节点。
最后,NetworkX 的 draw() 函数用于绘制具有指定颜色的图形。node_color 参数设置为 color_map 列表,它将每个节点映射到其相应的颜色。
接下来,我们计算红色节点和绿色节点之间的最短路径。
示例中创建的随机图中的起始(红色)和结束(绿色)节点之间的最短路径是使用 NetworkX 的 Shortest_path() 函数计算的。
该函数将图以及起始节点和结束节点的 ID 作为输入。结果存储在变量 path 中,它形成两个节点之间最短路径的节点列表。
path=nx.shortest_path(G,source=0, target=99)
让我们将最短路径涂成红色,即最短路径上的所有边都应涂成红色,所有其他边涂成黑色。
= [(path[i], path[i+1]) for i in range(len(path)-1)]
edge_colors = []
for edge in G.edges:
if edge in edges_on_path \
or tuple(reversed(edge)) in edges_on_path:
edge_colors.append("red")
else:
edge_colors.append("black")
nx.draw_spring(G, node_color=color_map, edge_color=edge_colors, with_labels=True)
最短路径上的边存储在 edges_on_path 列表中。
这是通过迭代 path 列表中的节点并将相邻节点之间的边添加到 edges_on_path 列表中来完成的。
然后,根据边是否在最短路径上创建 edge_colors 列表。如果边缘位于最短路径上,则其颜色设置为“红色”。否则,其颜色设置为 “黑色”。
最后,NetworkX 的 draw_spring() 函数用于绘制具有指定节点和边颜色的图形。node_color 参数设置为 color_map 列表,该列表将每个节点映射到其相应的颜色。将 edge_color 参数设置为 edge_colors 列表,该列表将每条边映射到其相应的颜色。
通过使用 Python 中的 networkx 库,你可以轻松创建和分析复杂图,包括有向图和无向图、多重图等。
来源—–程序员小寒