2015-10-16 17 views
1

我有一个JSON对象。例如:如何使用networkx可视化任意json?

js = {'a':'b', 'c':[10, 20], 'd':{'f':'k', 'l':'m'}} 

现在,我想用networkx库,以显示可视化JSON这个图。更详细地说,对于给定示例,我希望有一个指向a,cd节点的“根”节点。然后a节点应指向b节点,c节点应指向1020d节点应指向fl节点和最后fl节点应该分别指向km节点。所以,我想要执行以下操作:

G=nx.Graph() 
G.dad_nodes_from(['a', 'c', 'd', 'b', 10, 20, 'f', 'l', 'k', 'm']) 
G.add_edge('a','b') 
G.add_edge('c',10) 
G.add_edge('c',20) 
G.add_edge('d','f') 
G.add_edge('d','l') 
G.add_edge('f','k') 
G.add_edge('l','m') 

我可以手动执行,但如何自动执行它?

ADDED:问题的一部分来自d可能引用不同对象的事实。因此,d作为一个字典中的键与另一个字典中的d不是相同的节点。

回答

2

下面应该有所帮助,虽然对于您的额外部分,您需要检查密钥的存在性并修改(d,d1,d2)。如果你有这个例子,我可以编辑。

%matplotlib inline 

import networkx as nx 

js = {'a':'b', 'c':[10, 20], 'd':{'f':'k', 'l':'m'}} 

G=nx.Graph() 
for key in js.keys(): 
    G.add_edge('ROOT',key) 

def walk(node): 
    for key, item in node.items(): 
     if isinstance(item, list): 
      for i in item: 
       G.add_edge(key,i) 
     if isinstance(item, dict): 
      for j in item.keys(): 
       G.add_edge(key,j) 
      walk(item) 
     elif isinstance(item,str): 
      G.add_edge(key,item) 

walk(js) 
nx.draw(G,with_labels=True) 

enter image description here

+0

谢谢。我认为在函数中应该返回G(否则它不起作用)。也没有根节点(注意指向'a','c','d')。 – Roman

+0

啊我的错误你是对的..我刚刚编辑。如果你有重复键的例子,我会进一步修改 – ryanmc

相关问题