我正在使用 treelib 生成树,现在我需要易于阅读的树版本,所以我想将它们转换成图像。例如:
以下树的示例 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"]}}]}}
无论如何使用 graphviz 或 d3.js 或其他一些 python 库来使用此 JSON 数据生成树?
原文由 Grimlock 发布,翻译遵循 CC BY-SA 4.0 许可协议
对于这样的树,无需使用库:您可以直接生成 Graphviz DOT 语言语句。唯一棘手的部分是从 JSON 数据中提取树的边缘。为此,我们首先将 JSON 字符串转换回 Python
dict
,然后递归解析dict
。如果树字典中的名称没有子项,则它是一个简单的字符串,否则,它是一个字典,我们需要扫描其
"children"
列表中的项目。我们找到的每个(父母,孩子)对都附加到全局列表edges
。这个有点神秘的行:
从
treedict
获取单个密钥。这给了我们这个人的名字,因为这是treedict
中唯一的关键。在 Python 2 中我们可以做但是前面的代码在 Python 2 和 Python 3 中都有效。
标准错误输出
标准输出
上面的代码在 Python 2 和 Python 3 上运行。它将 JSON 数据打印到 stderr,以便我们验证它是否正确。然后它将 Graphviz 数据打印到标准输出,以便我们可以将其捕获到文件或直接通过管道传输到 Graphviz 程序。例如,如果脚本名为“tree_to_graph.py”,那么您可以在命令行中执行此操作以将图形保存为名为“tree.png”的 PNG 文件:
这是 PNG 输出: