You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NetworkX调整:如何让箭头/边指向正确方向并添加节点标签

NetworkX 有向图样式调整与节点上方标签添加方案

一、替换布局匹配层级结构目标样式

你当前代码用的spring_layout是力导向布局,会让节点随机分散,完全不适合呈现层级关系的图。要匹配类似流程图的层级目标样式,推荐两种方案:

方案1:用NetworkX自带多部分布局(无需额外依赖)

先给每个节点指定层级属性,再生成横向/纵向的层级布局:

import networkx as nx
import matplotlib.pyplot as plt

G = nx.DiGraph()
edges = [(1, 2), (1, 3), (2, 4), (2, 5), (3, 6), (4, 7), (5, 7), (3, 8), (5, 8), (7, 9), (8, 9), (6, 10), (9, 10)]
G.add_edges_from(edges)

# 给每个节点绑定层级(按你的图结构定义)
layer_mapping = {
    1: 0,
    2: 1, 3: 1,
    4: 2, 5: 2, 6: 2,
    7: 3, 8: 3,
    9: 4,
    10: 5
}
for node, layer in layer_mapping.items():
    G.nodes[node]['layer'] = layer

# 生成横向层级布局,同层节点水平排列
pos = nx.multipartite_layout(G, subset_key='layer', align='horizontal', scale=2)

# 绘制基础元素
nx.draw_networkx_nodes(G, pos, node_size=500, node_color='lightblue')
nx.draw_networkx_edges(G, pos, edgelist=G.edges(), arrowstyle='->', arrowsize=15)
nx.draw_networkx_labels(G, pos, font_size=12)

方案2:用Graphviz的dot布局(需安装依赖)

如果目标图是严格自上而下的层级结构,dot布局会更精准。先安装依赖:

pip install pygraphviz

然后替换布局生成代码:

# 替换原有pos生成代码
pos = nx.nx_agraph.graphviz_layout(G, prog='dot')

二、添加节点上方的文本标签

在基础绘图代码后,添加以下逻辑实现节点上方标签:

# 自定义节点上方的标签内容
top_labels = {node: f"Tag {node}" for node in G.nodes}
# 偏移标签位置:在原节点y坐标基础上增加0.15(可根据布局调整数值)
pos_top = {node: (x, y + 0.15) for node, (x, y) in pos.items()}
# 绘制上层标签
nx.draw_networkx_labels(G, pos_top, top_labels, font_size=10, font_color='darkred', font_weight='bold')

plt.axis('off')
plt.tight_layout()
plt.show()

关键说明

  • 布局替换:放弃随机分散的力导向布局,改用层级布局,让节点按你定义的逻辑有序排列
  • 上层标签实现:通过复制原节点位置并偏移y轴坐标,单独绘制一组标签,就能实现“节点上方文本”的效果

内容的提问来源于stack exchange,提问作者kene02

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 14:05:06