我有一个想要输出到json文件的网络。但是,当我输出它时,节点目标将转换为数字,并且与作为字符串的节点ID不匹配。
例如:
G = nx.DiGraph(data)
G.edges()
结果:
[(22, 'str1'),
(22, 'str2'),
(22, 'str3')]
在python中。这是正确的。
但是在输出中,当我写出这样的数据时......
json.dump(json_graph.node_link_data(G), f,
indent = 4, sort_keys = True, separators=(',',':'))
同时为三个目标节点' str1',' str2'和' str3' ...
的ID{
"id":"str1"
},
{
"id":"str2"
},
{
"id":"str3"
}
节点22的目标已变为数字
{
"source":22,
"target":972
},
{
"source":22,
"target":1261
},
{
"source":22,
"target":1259
}
对于具有字符串ID的所有节点都会发生这种情况
为什么会这样,我该如何预防?
期望的结果是"目标"字段应保留字符串ID,或者字符串ID以与目标匹配的方式变为数字。
答案 0 :(得分:1)
为什么会这样
这是一个功能。并非所有图形库都接受字符串作为标识符,但我所知道的只接受整数。
我该如何预防?
使用nodes
地图按节点名称替换ID:
>>> import networkx as nx
>>> import pprint
>>> g = nx.DiGraph()
>>> g.add_edge(1, 'foo')
>>> g.add_edge(2, 'bar')
>>> g.add_edge('foo', 'bar')
>>> res = nx.node_link_data(g)
>>> pprint.pprint(res)
{'directed': True,
'graph': {},
'links': [{'source': 0, 'target': 3},
{'source': 1, 'target': 2},
{'source': 3, 'target': 2}],
'multigraph': False,
'nodes': [{'name': 1}, {'name': 2}, {'name': 'bar'}, {'name': 'foo'}]}
>>> res['links'] = [
{
'source': res['nodes'][link['source']]['name'],
'target': res['nodes'][link['target']]['name']
}
for link in res['links']]
>>> pprint.pprint(res)
{'directed': True,
'graph': {},
'links': [{'source': 1, 'target': 'foo'},
{'source': 2, 'target': 'bar'},
{'source': 'foo', 'target': 'bar'}],
'multigraph': False,
'nodes': [{'name': 1}, {'name': 2}, {'name': 'bar'}, {'name': 'foo'}]}
答案 1 :(得分:0)
要使输出符合node_link_data文档中链接的d3模板,您可以对node_link_data函数进行一些简单的更改。只需运行以下功能,然后使用它。我改变的只是修剪模板的一些不必要的输出,并存储图形标签而不是索引。用于目标和目标的原始函数的索引是在函数中创建的,因此它不是您可以从图形本身中提取的,因此如果您想确定您的节点标签对应于您的链接,则最安全的是node_link_data。
The D3 Template this creates data for is here
请注意,如果您在不添加节点或链接属性的情况下使用以下数据,则需要从d3模板中删除以下行:
...
<form action="" method="POST" enctype="multipart/form-data">{% csrf_token %}
{{ form|crispy }}
<input type="submit" value="Enviar" class="btn btn-primary"/>
</form>
...
和
.attr("stroke-width", function(d) { return Math.sqrt(d.value); })
修改功能:
.attr("fill", function(d) { return color(d.group); })