You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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)

修改说明:

  1. 我给view_graph函数加了node_names参数,方便传入节点名称映射字典;
  2. nx.draw()里添加了labels=node_names,让节点显示字典里的名称;
  3. 彻底修正了relation字典里的所有边元组,确保每条边的标签都绑定到正确的边上。

这样修改后,你就能看到两个独立的Paul节点,每条边的标签也会准确对应到所属的边上啦!

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

火山引擎 最新活动