如何从networkx生成父子关系数据以使用d3.js?

时间:2017-07-08 23:21:50

标签: d3.js networkx

我想从python networkx生成父子关系数据。我正在使用多重图形。我想使用下面的javascript以html格式生成我的图形:

https://bl.ocks.org/mbostock/4339184

数据需要采用某种格式,就像上面链接中提到的flare.csv文件一样。

所以,我的问题是如何从networkx生成数据,就像上面的parent.child关系数据一样?

1 个答案:

答案 0 :(得分:1)

首先,让我们根据您的描述创建一个图表(技术上,一棵树):

G=nx.DiGraph()
nodes = ['n0', 'n1', 'n1_1', 'n1_2', 'n2', 'n2_1', 'n2_2', 'n2_1_1']
edges = [('n0', 'n1'), ('n0', 'n2'), 
     ('n1', 'n1_1'), ('n1', 'n1_2'),
     ('n2', 'n2_1'), ('n2', 'n2_2'),
     ('n2_1', 'n2_1_1')]

G.add_edges_from(edges)
G.add_nodes_from(nodes)

首先应该获取图的根,然后从根遍历到每个节点。

Root是in_degree为零的唯一节点,因此:

root = [k for k, v in G.in_degree().items() if v == 0]
# ['n0']

接下来,计算从根到每个叶子的最短路径。我们需要有一个排除根的节点列表。

all_but_root = [i for i in nodes if i not in root]
res =[]
for i in all_but_root:
    res.append(nx.shortest_path(G, root[0], i))

此外,如果您希望以无痛的方式获得格式正确的输出,可以使用以下代码:

for i in res:
    txt = ""
    for j in i:
        if j != i[-1]:
            txt += j + "."
        else:
            txt += j + ","
    print (txt)