我正在使用树库来生成树,现在我需要一个易于阅读的版本的树,所以我想把它们转换成图像。例如:
以下树的示例JSON数据:
带数据:
>>> print(tree.to_json(with_data=True))
{"Harry": {"data": null, "children": [{"Bill": {"data": null}}, {"Jane": {"data": null, "children": [{"Diane": {"data": null}}, {"Mark": {"data": null}}]}}, {"Mary": {"data": null}}]}}
无数据:
>>> print(tree.to_json(with_data=False))
{"Harry": {"children": ["Bill", {"Jane": {"children": [{"Diane": {"children": ["Mary"]}}, "Mark"]}}]}}
3条答案
按热度按时间nfzehxib1#
对于这样的树,不需要使用库:您可以直接生成GraphvizDOT语言语句。唯一棘手的部分是从JSON数据中提取树边缘。为此,我们首先将JSON字符串转换回Python
dict
,然后递归解析dict
。如果dict树中的一个名字没有子项,那么它就是一个简单的字符串,否则,它就是一个dict,我们需要扫描它的
"children"
列表中的项。我们找到的每一个(父,子)对都会被追加到一个全局列表edges
中。这句有点隐晦的台词:
从
treedict
中得到一个键。这会给我们这个人的名字,因为这是treedict
中唯一的键。在Python 2中,我们可以但是前面的代码在Python2和Python3中都可以使用。
标准错误输出
标准输出
上面的代码运行在Python 2和Python 3上。它将JSON数据打印到stderr,这样我们就可以验证它是否正确。然后它将Graphviz数据打印到stdout,这样我们就可以将它捕获到一个文件中,或者直接将它通过管道传输到Graphviz程序中。例如,如果脚本的名称是“tree_to_graph.py”,那么你可以在命令行中这样做,将图形保存为一个名为“tree.png”的PNG文件:
下面是PNG输出:
flvlnr442#
根据PM 2Ring的答案,我创建了一个可通过命令行使用的脚本:
uqdfh47h3#
下面是使用
graphviz
将snwflk的json数据直接转换为树的解决方案:您输入的数据:
我们可以使用广度优先搜索遍历树,这样我们就可以确保遍历所有边,这是使用graphviz构建树的要求:
输出图如下所示(我认为示例树图像中玛丽的节点位置错误)