如何使用 networkx 可视化任意 json?
How to visualize arbitrary json using networkx?
我有一个 JSON 对象。例如:
js = {'a':'b', 'c':[10, 20], 'd':{'f':'k', 'l':'m'}}
现在,我想使用 networkx
库来显示可视化此 JSON 的图表。更详细地说,对于给定的示例,我希望有一个 "root" 节点指向 a
、c
和 d
节点。那么a
节点应该指向b
节点,c
节点应该指向10
和20
,d
节点应该指向f
和 l
节点以及最后的 f
和 l
节点应该分别指向 k
和 m
节点。所以,我想执行以下操作:
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')
我可以手动完成,但是如何自动完成?
已添加: 部分问题来自 d
可能引用不同的对象。因此,d
作为一个字典中的键与另一个字典中的 d
不是同一个节点。
下面应该有所帮助,但对于您的附加部分,您需要检查密钥是否存在并修改 (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)
我有一个 JSON 对象。例如:
js = {'a':'b', 'c':[10, 20], 'd':{'f':'k', 'l':'m'}}
现在,我想使用 networkx
库来显示可视化此 JSON 的图表。更详细地说,对于给定的示例,我希望有一个 "root" 节点指向 a
、c
和 d
节点。那么a
节点应该指向b
节点,c
节点应该指向10
和20
,d
节点应该指向f
和 l
节点以及最后的 f
和 l
节点应该分别指向 k
和 m
节点。所以,我想执行以下操作:
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')
我可以手动完成,但是如何自动完成?
已添加: 部分问题来自 d
可能引用不同的对象。因此,d
作为一个字典中的键与另一个字典中的 d
不是同一个节点。
下面应该有所帮助,但对于您的附加部分,您需要检查密钥是否存在并修改 (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)