如何用Python NetworkX绘制分层网络图并按用户输入确定父子节点连接
实现方案
一、NetworkX原生实现方案
你要的效果完全可以基于NetworkX实现,不需要换库,核心是手动指定分层坐标实现固定布局,再加交互式询问生成边即可。
完整实现代码
import networkx as nx import matplotlib.pyplot as plt # 1. 定义分层节点 layer1 = ["Node1"] layer2 = ["Node2", "Node3"] layer3 = [f"Node{i}" for i in range(4, 8)] layer4 = [f"Node{i}" for i in range(8, 12)] all_nodes = layer1 + layer2 + layer3 + layer4 # 2. 自定义分层坐标,固定各层位置 pos = {} # 第一层x=0,y坐标居中 pos["Node1"] = (0, 0) # 第二层x=2,上下分布两个节点 pos["Node2"] = (2, 1) pos["Node3"] = (2, -1) # 第三层x=4,均匀分布4个节点 for idx, node in enumerate(layer3): pos[node] = (4, 1.5 - idx * 1) # 第四层x=6,均匀分布4个节点 for idx, node in enumerate(layer4): pos[node] = (6, 1.5 - idx * 1) # 3. 交互式询问生成边 edges = [("Node1", "Node2"), ("Node1", "Node3")] # 第一层到第二层的固定边 # 询问第二层到第三层的连接 print("=== 确认第二层到第三层的边连接 ===") for u in layer2: for v in layer3: res = input(f"{u} 与 {v} 是否存在边?输入y确认,其他输入视为不存在:").strip().lower() if res == "y": edges.append((u, v)) # 询问第三层到第四层的连接 print("=== 确认第三层到第四层的边连接 ===") for u in layer3: for v in layer4: res = input(f"{u} 与 {v} 是否存在边?输入y确认,其他输入视为不存在:").strip().lower() if res == "y": edges.append((u, v)) # 4. 构建有向图并绘图 G = nx.DiGraph() G.add_nodes_from(all_nodes) G.add_edges_from(edges) plt.figure(figsize=(12, 8)) # 绘制矩形节点 nx.draw_networkx_nodes( G, pos, node_size=3000, node_shape="s", # s代表正方形,如需更扁的矩形可以自定义matplotlib的marker node_color="lightblue", edgecolors="black" ) # 绘制带箭头的边 nx.draw_networkx_edges( G, pos, arrowstyle="->", arrowsize=20, edge_color="gray" ) # 绘制外置标签,坐标向右偏移0.3实现外置效果 label_pos = {node: (coord[0]+0.3, coord[1]) for node, coord in pos.items()} nx.draw_networkx_labels(G, label_pos, font_size=12) plt.axis("off") plt.tight_layout() plt.show()
关键配置说明
- 分层布局:手动给每个节点指定x、y坐标,确保同层节点x坐标一致,y坐标上下均匀分布,完全符合你要的排布效果
- 节点样式:
node_shape="s"指定为矩形,可调整node_size参数改变矩形大小 - 标签外置:将标签的x坐标相对节点位置偏移0.3,实现标签在节点外部展示
二、更适配的可选库
如果你的需求后续会扩展更复杂的分层布局、交互能力,可选择以下更适配的库:
- PyGraphviz:原生支持dot分层布局,不需要手动计算坐标,只需要给节点设置层级属性即可自动完成整齐的分层排布,节点样式、边样式自定义能力更强,渲染效果更专业
- Plotly:适合做交互式分层网络图,支持节点悬停展示详情、拖拽调整位置,可导出为HTML交互式文件,分享和展示体验更好
- Diagrams:如果是绘制架构类分层图,该库专门面向架构图场景,内置大量行业通用节点图标,代码写法更简洁
内容的提问来源于stack exchange,提问作者hbstha123
相关产品推荐
相关产品推荐

