如何为NetworkX创建的节点添加位置元组属性?
问题分析与解决方案
你遇到的核心问题是add_nodes_from的属性传递逻辑理解有误——当你用DG.add_nodes_from(rooms, pos = xpos_ypos)时,pos参数会被当作所有节点的共同属性,导致每个节点的pos都被设置成了整个坐标列表,而非对应单个节点的坐标。
两种可行的解决方法:
方法1:用nx.set_node_attributes批量设置属性
先把节点和对应坐标配对成字典,再一次性给所有节点绑定属性:
# 替换原来的DG.add_nodes_from(rooms, pos = xpos_ypos) DG.add_nodes_from(rooms) # 创建节点到坐标的映射字典 pos_dict = {room: pos for room, pos in zip(rooms, xpos_ypos)} # 批量为节点设置pos属性 nx.set_node_attributes(DG, pos_dict, 'pos')
方法2:添加节点时直接附带专属属性
把节点和对应的属性打包成元组列表,直接传给add_nodes_from:
# 替换原来的DG.add_nodes_from(rooms, pos = xpos_ypos) # 生成 (节点名, {'pos': 对应坐标}) 的元组列表 nodes_with_attrs = [(room, {'pos': pos}) for room, pos in zip(rooms, xpos_ypos)] DG.add_nodes_from(nodes_with_attrs)
修改后的验证效果
运行修改后的代码,再打印pos = nx.get_node_attributes(DG, 'pos'),就能得到你期望的结果:
{'a2a': (5, 0), 'a0': (1, 2), 'a1': (9, 2), '3': (5, 4)}
原方法失效的原因
add_nodes_from(iterable, **attrs)的设计逻辑是:**attrs中的键值对会被统一应用到iterable里的每一个节点上。所以你传入pos = xpos_ypos时,所有节点都会共享这个完整的坐标列表作为pos属性,而不是各自取对应位置的元素。
内容的提问来源于stack exchange,提问作者Zeid Tisnes
相关产品推荐
相关产品推荐

