NetworkX自定义图节点标签与修复边标签关联错误的技术求助
解决方案:修复家族关系图的节点显示和边标签问题
我来帮你搞定这两个问题,咱们一步步拆解:
问题1:显示节点名称而非索引
你需要保持节点的索引唯一性(毕竟有两个Paul),但在绘图时替换成对应的名称。只需要在nx.draw()函数里添加labels参数,把你的index_to_name字典传进去就行——这样底层节点还是用索引区分,但显示的是字典里的名称。
问题2:修复边标签对应错误
看了你的代码,发现问题出在relation字典的键上:你添加的边和标签绑定的边元组不匹配。比如你添加了g.add_edge(3, 6),但却把标签绑定到(1,6),这就导致标签跑到错误的边上了。咱们把relation里的键修正成和实际添加的边一致就行。
修改后的完整代码
import pandas as pd import networkx as nx import matplotlib.pyplot as plt def view_graph(graph, labels, node_names): ''' Plots the graph with custom node labels ''' pos = nx.spring_layout(graph) # 绘制节点时指定显示的名称 nx.draw(graph, pos, with_labels=True, labels=node_names) nx.draw_networkx_edge_labels(graph, pos, edge_labels=labels) plt.axis('off') plt.show() index_to_name = {1: "Paul", 2: "Magda", 3: "Paul", 4: "Anna", 5: "Marie", 6: "John", 7: "Mark"} relation = {} g = nx.DiGraph() # 添加边并绑定正确的标签 g.add_edge(1, 4) relation[(1,4)] = "dad" g.add_edge(2, 4) relation[(2,4)] = "mom" g.add_edge(1, 5) relation[(1,5)] = "dad" g.add_edge(2, 5) relation[(2,5)] = "mom" g.add_edge(3, 6) relation[(3,6)] = "dad" # 修正:对应实际添加的边(3,6) g.add_edge(4, 6) relation[(4,6)] = "mom" # 修正:对应实际添加的边(4,6) g.add_edge(3, 7) relation[(3,7)] = "dad" # 修正:对应实际添加的边(3,7) g.add_edge(4, 7) relation[(4,7)] = "mom" # 修正:对应实际添加的边(4,7) # 传入node_names参数用于节点显示 view_graph(g, relation, index_to_name)
修改说明:
- 我给
view_graph函数加了node_names参数,方便传入节点名称映射字典; - 在
nx.draw()里添加了labels=node_names,让节点显示字典里的名称; - 彻底修正了
relation字典里的所有边元组,确保每条边的标签都绑定到正确的边上。
这样修改后,你就能看到两个独立的Paul节点,每条边的标签也会准确对应到所属的边上啦!
内容的提问来源于stack exchange,提问作者Martin Kunze




