【问题标题】:How to visualize arbitrary json using networkx?如何使用networkx可视化任意json?
【发布时间】:2016-01-15 05:31:31
【问题描述】:

我有一个 JSON 对象。例如:

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

现在,我想使用networkx 库来显示可视化此 JSON 的图形。更详细地说,对于给定的示例,我希望有一个“根”节点指向 acd 节点。那么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')

我可以手动完成,但如何自动完成?

添加:部分问题来自d 可能引用不同的对象这一事实。所以,d 作为一个字典中的键与另一个字典中的d 不是同一个节点。

【问题讨论】:

    标签: python json recursion networkx


    【解决方案1】:

    下面应该会有所帮助,但对于您的附加部分,您需要检查密钥是否存在并修改 (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)
    

    【讨论】:

    • 谢谢。我认为在函数中应该有 return G (否则它不起作用)。也没有根节点(注意指向'a','c','d')。
    • 我错了,你是对的。我刚刚编辑过。如果您有重复键的示例,我将进一步修改
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 2016-07-11
    • 1970-01-01
    • 2022-12-10
    • 2018-02-11
    • 2019-07-04
    相关资源
    最近更新 更多