如何在Python中绘制顶点高度对应成本的3D有向图?
实现有向图的3D可视化(顶点高度对应成本)
核心思路
借助NetworkX构建图结构,结合Matplotlib的3D绘图模块,将NetworkX生成的2D布局作为x、y坐标,顶点成本值作为z轴高度,分别绘制边和顶点,完成3D可视化。
完整代码实现
import networkx as nx import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D # 定义图的顶点、边和成本 V = [1, 2, 3, 4, 5] E = { 1: [2, 3, 4], 2: [1, 2, 3], 3: [1, 4, 5], 4: [5], 5: [1, 3] } c = [81, 23, 43, 22, 100] # 1. 创建有向图并添加顶点和边 G = nx.DiGraph() G.add_nodes_from(V) for u, neighbors in E.items(): for v in neighbors: G.add_edge(u, v) # 2. 获取顶点的2D布局坐标(x, y),作为3D的x、y轴基础 pos_2d = nx.spring_layout(G, seed=42) # seed固定布局,保证复现性 # 3. 建立顶点到z轴高度(成本)的映射 z_dict = {v: c[v-1] for v in V} # 顶点编号从1开始,对应成本列表的索引0 # 4. 创建3D绘图对象 fig = plt.figure(figsize=(10, 8)) ax = fig.add_subplot(111, projection='3d') # 5. 绘制边:遍历每条边,连接两个顶点的3D坐标 for u, v in G.edges(): x_u, y_u = pos_2d[u] z_u = z_dict[u] x_v, y_v = pos_2d[v] z_v = z_dict[v] ax.plot([x_u, x_v], [y_u, y_v], [z_u, z_v], color='#999999', linewidth=1.5) # 6. 绘制顶点:用散点表示,z轴高度为对应成本 x_coords = [pos_2d[v][0] for v in V] y_coords = [pos_2d[v][1] for v in V] z_coords = [z_dict[v] for v in V] ax.scatter(x_coords, y_coords, z_coords, s=500, c=z_coords, cmap='viridis', edgecolors='black') # 7. 添加顶点标签(显示顶点编号和对应成本) for v in V: x, y = pos_2d[v] z = z_dict[v] ax.text3D(x, y, z + 2, f"{v}\n(c={z_dict[v]})", ha='center', va='center', fontsize=10) # 8. 设置坐标轴和标题 ax.set_xlabel('X轴') ax.set_ylabel('Y轴') ax.set_zlabel('顶点成本') ax.set_title('有向图3D可视化(顶点高度对应成本)') # 调整视角,优化查看效果 ax.view_init(elev=30, azim=45) plt.show()
关键细节说明
- 固定布局:
spring_layout的seed参数固定后,每次运行的2D布局一致,3D可视化效果可稳定复现。 - 成本映射逻辑:顶点编号从1起始,成本列表
c从索引0起始,因此用v-1关联顶点与对应成本值。 - 边的样式:默认用灰色线段绘制边,若需显示有向箭头,可将
ax.plot替换为ax.quiver,并调整箭头大小、长度等参数优化显示效果。 - 顶点样式:散点大小、颜色映射可按需调整,
cmap='viridis'会让成本越高的顶点颜色越深,直观区分成本差异。
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

