- 嗨,我对网络很陌生,我一直在尝试编写一个代码来获取文件夹的所有 .edges 和 .nodes 文件并生成一个 graphml 文件,以便我可以在另一个软件中将其可视化。但是我还需要在我的节点中添加一些颜色但是当我尝试它时我得到了:KeyError 29
- 我在我的节点数组中运行一个循环来添加每个节点的颜色。
这是我尝试添加颜色属性的代码部分。因此,节点将用 4 种不同的颜色着色:最佳适应度,最差,前 10% 最佳适应度和 10% 最差。
for i in range(len(nodes)): if nodes[i]==top: NetGraph.node[i]['color']='r'
希望你能帮我!干杯
1 回答
如果您尝试将存储在多个不同.nodes' and
.edges 文件中的关系数据“合并”到一个图形中,那么当从磁盘读取文件时,您可能会遇到尚未添加的节点到图表。
总的来说,我觉得需要更多信息才能为这个问题提供更有意义的答案。例如:.node
and.edge
文件的格式是什么?top
变量中有什么?(这是代表阈值的列表还是单个数字变量?)。
但是,根据到目前为止在这个问题中提到的内容,这里有一些提示:
尝试先构建图表,然后再为它着色。如果您已经拥有健身数据,这可能会显得无足轻重,但这将是让您获得工作代码的最简单方法。
确保您的节点 ID 确实是整数。也就是说,每个节点在图中通过其索引值是已知的。例如 2、3、5 等,而不是“巴黎”、“伦敦”、“柏林”等(即字符串节点 ID)。如果是后者,那么 for 将更好地形成为:
for aNode in G.nodes(data = True):
. 这将返回一个包含每个节点 ID 的迭代器和一个包含所有现有节点数据的字典。如果
top
是单个变量top
,那么将节点的 ID 与阈值进行比较是没有意义的。这就像说如果 22(这是一个节点 ID)等于 89(这是效率的某种表达)然后将红色应用于节点。如果top
是一个包含所有被视为顶级节点的节点的列表,则条件表达式应该是:if nodes[i] in top:
。您似乎跳过了
if
(?) 下方的缩进。如果条件为True
,则为节点分配颜色的语句要正常工作,需要向右缩进一组 4 个空格。分配颜色的表达式是正确的。
请注意,Networkx 将尝试将它在 Graph 中遇到的每个节点和边缘属性写入适当的格式。有关这方面的更多信息,请参阅对此问题的回复。因此,一旦您对给定图(G)的结构感到满意,那么您可以简单地调用
networkx.write_graphml(G, 'mygraph.gml')
将其保存到磁盘(其中networkx
是模块的名称)。这些networkx.write_*
函数会将图形 (G) 的完整版本导出为多种不同的格式,或者如果无法正确序列化数据类型,则会引发异常。
我希望这有帮助。如果稍后提供更多详细信息,很高兴修改回复。