Python 绘制有向加权图:景点距离可视化
Python 绘制有向加权图:景点距离可视化
假设我们有一组景点,它们之间的距离可以用一个矩阵表示,如下所示:
[[0, 300, 360, 210, 530, 475, 500, 690],
[300, 0, 380, 270, 230, 285, 200, 390],
[360, 380, 0, 510, 230, 665, 490, 680],
[210, 270, 510, 0, 470, 265, 450, 640],
[530, 230, 230, 470, 0, 515, 260, 450],
[475, 285, 665, 265, 515, 0, 460, 650],
[500, 200, 490, 450, 260, 460, 0, 190],
[690, 390, 680, 640, 450, 650, 190, 0]]
每一行代表从一个景点到其他所有景点的距离。我们想使用 Python 的 networkx 库来绘制一个有向加权图,直观地展示这些景点之间的距离关系。
代码实现
import networkx as nx
import matplotlib.pyplot as plt
# 创建有向加权图
G = nx.DiGraph()
# 添加节点
G.add_nodes_from(range(8))
# 添加边和权重
edges = [(0, 1), (0, 2), (0, 3), (0, 4), (0, 5), (0, 6), (0, 7),
(1, 0), (1, 2), (1, 3), (1, 4), (1, 5), (1, 6), (1, 7),
(2, 0), (2, 1), (2, 3), (2, 4), (2, 5), (2, 6), (2, 7),
(3, 0), (3, 1), (3, 2), (3, 4), (3, 5), (3, 6), (3, 7),
(4, 0), (4, 1), (4, 2), (4, 3), (4, 5), (4, 6), (4, 7),
(5, 0), (5, 1), (5, 2), (5, 3), (5, 4), (5, 6), (5, 7),
(6, 0), (6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 7),
(7, 0), (7, 1), (7, 2), (7, 3), (7, 4), (7, 5), (7, 6)]
weights = [300, 360, 210, 530, 475, 500, 690,
300, 380, 270, 230, 285, 200, 390,
360, 380, 510, 230, 665, 490, 680,
210, 270, 510, 470, 265, 450, 640,
530, 230, 230, 470, 515, 260, 450,
475, 285, 665, 265, 515, 460, 650,
500, 200, 490, 450, 260, 460, 190,
690, 390, 680, 640, 450, 650, 190]
G.add_weighted_edges_from(zip(edges, weights))
# 绘制图形
pos = nx.spring_layout(G)
nx.draw(G, pos, with_labels=True, node_size=1000, node_color='lightblue', font_size=10, font_weight='bold')
# 添加边的权重
labels = nx.get_edge_attributes(G, 'weight')
nx.draw_networkx_edge_labels(G, pos, edge_labels=labels)
plt.show()
代码解释
- 导入库: 首先,导入
networkx和matplotlib.pyplot库。 - 创建图: 使用
nx.DiGraph()创建一个有向加权图G。 - 添加节点: 使用
G.add_nodes_from(range(8))添加 8 个节点,节点编号从 0 到 7。 - 添加边和权重: 使用
G.add_weighted_edges_from(zip(edges, weights))添加边和权重。edges列表包含所有景点之间的连接关系,例如(0, 1)代表从景点 0 到景点 1 的连接。weights列表对应edges中每条边的权重,即景点之间的距离。
- 确定节点位置: 使用
nx.spring_layout(G)确定每个节点在图形中的位置,spring_layout可以自动计算节点的位置,使它们之间保持一定的距离。 - 绘制图形: 使用
nx.draw(G, pos, ...)绘制图形,设置一些参数来控制图形的外观,例如:with_labels=True: 显示节点标签。node_size: 节点的大小。node_color: 节点的颜色。font_size和font_weight: 节点标签的字体大小和粗细。
- 添加边权重: 使用
nx.draw_networkx_edge_labels(G, pos, edge_labels=labels)在图中添加边权重。labels = nx.get_edge_attributes(G, 'weight')获取所有边的权重并存储在labels字典中。
- 显示图形: 使用
plt.show()显示绘制好的图形。
运行结果
运行代码后,将会生成一个有向加权图,每个节点代表一个景点,每个节点之间的连接线代表景点之间的距离,连接线上的数字表示距离的权重。
通过这个可视化结果,我们可以清晰地看到景点之间的距离关系,方便我们制定旅游路线或者进行其他相关分析。
原文地址: https://www.cveoy.top/t/topic/fPRd 著作权归作者所有。请勿转载和采集!