目标不匹配networkx json文件中的节点ID

时间:2016-08-04 02:44:22

标签: python networkx

我有一个想要输出到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以与目标匹配的方式变为数字。

2 个答案:

答案 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); })