Python中如何表示边权数组形式的图数据并完成可视化
带权有向图可视化实现方案
你可以直接用networkx搭配matplotlib实现需求,这套方案完全适配你给出的数组存储格式,替换A、B数组即可通用到其他同结构的图数据。
数据格式对应规则
- 数组A:形状为
(边总数, 2),每行元素[i,j]对应一条从节点i指向节点j的有向边 - 数组B:形状为
(边总数, 1),每行数值对应A数组同位置边的关联取值(权重)
测试用例数据
你提供的测试数据代码如下:
import numpy as np A=np.array([[0, 1], [0, 3], [1, 2], [1, 4], [2, 5], [3, 4], [4, 5]]) B=np.array([[1], [2], [3], [4], [5], [6], [7]])
可直接运行的实现代码
import networkx as nx import matplotlib.pyplot as plt # 初始化有向图实例 G = nx.DiGraph() # 逐行读取边和对应权重,加入图结构 for (start_node, end_node), weight in zip(A, B.flatten()): G.add_edge(start_node, end_node, weight=weight) # 配置分层布局,匹配参考图的节点排列逻辑:按拓扑排序结果分层对齐 for layer_idx, node_group in enumerate(nx.topological_generations(G)): for node in node_group: G.nodes[node]["layer"] = layer_idx node_pos = nx.multipartite_layout(G, subset_key="layer") # 按样式绘制各元素 plt.figure(figsize=(8, 6)) # 绘制节点:浅蓝色填充、黑色边框 nx.draw_networkx_nodes(G, node_pos, node_size=500, node_color="#add8e6", edgecolors="black") # 绘制带箭头的有向边 nx.draw_networkx_edges(G, node_pos, arrowstyle="->", arrowsize=20, width=2, edge_color="dimgray") # 绘制节点编号标签 nx.draw_networkx_labels(G, node_pos, font_size=12, font_weight="bold") # 绘制边上的权重标签 edge_label_map = {(u, v): data["weight"] for u, v, data in G.edges(data=True)} nx.draw_networkx_edge_labels(G, node_pos, edge_labels=edge_label_map, font_size=12) # 关闭坐标轴,调整布局 plt.axis("off") plt.tight_layout() plt.show()
输出效果
运行代码后生成的可视化结果和你给出的预期效果完全一致:
通用调整提示:后续更换同格式的A、B数组时无需修改核心绘图逻辑;如果需要调整节点大小、颜色、边粗细、字体大小等样式,直接修改对应绘图函数的参数即可。
内容的提问来源于stack exchange,提问作者Wiz123
相关产品推荐
相关产品推荐

