使用NetworkX的GraphML写入Waxman图时遇tuple类型不支持错误
解决NetworkX写入Waxman图到GraphML时的元组类型错误
问题原因
nx.waxman_graph生成的图中,每个节点默认带有pos属性,其值是表示坐标的元组(例如(0.23, 0.78))。而GraphML格式的writer不支持元组作为属性值类型,因此执行nx.write_graphml时会抛出NetworkXError。
解决方法
方法1:删除节点的pos属性(无需保留坐标时使用)
直接遍历所有节点,删除导致报错的pos属性,即可正常写入GraphML文件:
import networkx as nx import matplotlib.pyplot as plt import numpy as np my_graph_waxman=nx.waxman_graph(6, beta=0.8, alpha=0.6, L=None, domain=(0, 0, 1, 1), metric=None, seed=None) nx.draw(my_graph_waxman, with_labels=True, font_weight='normal') plt.axis('on') plt.show() # 删除所有节点的pos属性 for node in my_graph_waxman.nodes: del my_graph_waxman.nodes[node]['pos'] nx.write_graphml(my_graph_waxman, "waxman_Iteration.graphml")
方法2:转换元组为GraphML支持的类型(需保留坐标时使用)
如果需要保留节点的位置信息,可以将元组转换为列表或字符串(这两种类型都被GraphML支持):
import networkx as nx import matplotlib.pyplot as plt import numpy as np my_graph_waxman=nx.waxman_graph(6, beta=0.8, alpha=0.6, L=None, domain=(0, 0, 1, 1), metric=None, seed=None) nx.draw(my_graph_waxman, with_labels=True, font_weight='normal') plt.axis('on') plt.show() # 将pos属性的元组转为列表(推荐,保留结构化数据) for node in my_graph_waxman.nodes: my_graph_waxman.nodes[node]['pos'] = list(my_graph_waxman.nodes[node]['pos']) # 也可以转为字符串:my_graph_waxman.nodes[node]['pos'] = str(my_graph_waxman.nodes[node]['pos']) nx.write_graphml(my_graph_waxman, "waxman_Iteration.graphml")
内容的提问来源于stack exchange,提问作者Waqas Ahmad
相关产品推荐
相关产品推荐

