我正在使用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"]}}]}}
答案 0 :(得分:7)
对于这样的树,不需要使用库:您可以直接生成Graphviz DOT语言语句。唯一棘手的部分是从JSON数据中提取树边。为此,我们首先将JSON字符串转换回Python dict
,然后递归地解析dict
。
如果树字典中的名字没有子节点,则它是一个简单的字符串,否则,它是一个字典,我们需要扫描其"children"
列表中的项目。我们找到的每个(父,子)对都会附加到全局列表edges
。
这个有点神秘的界限:
name = next(iter(treedict.keys()))
从treedict
获取一个密钥。这给了我们这个人的名字,因为那是treedict
中唯一的关键。在Python 2中我们可以做到
name = treedict.keys()[0]
但前面的代码适用于Python 2和Python 3。
from __future__ import print_function
import json
import sys
# Tree in JSON format
s = '{"Harry": {"children": ["Bill", {"Jane": {"children": [{"Diane": {"children": ["Mary"]}}, "Mark"]}}]}}'
# Convert JSON tree to a Python dict
data = json.loads(s)
# Convert back to JSON & print to stderr so we can verify that the tree is correct.
print(json.dumps(data, indent=4), file=sys.stderr)
# Extract tree edges from the dict
edges = []
def get_edges(treedict, parent=None):
name = next(iter(treedict.keys()))
if parent is not None:
edges.append((parent, name))
for item in treedict[name]["children"]:
if isinstance(item, dict):
get_edges(item, parent=name)
else:
edges.append((name, item))
get_edges(data)
# Dump edge list in Graphviz DOT format
print('strict digraph tree {')
for row in edges:
print(' {0} -> {1};'.format(*row))
print('}')
stderr输出
{
"Harry": {
"children": [
"Bill",
{
"Jane": {
"children": [
{
"Diane": {
"children": [
"Mary"
]
}
},
"Mark"
]
}
}
]
}
}
标准输出
strict digraph tree {
Harry -> Bill;
Harry -> Jane;
Jane -> Diane;
Diane -> Mary;
Jane -> Mark;
}
上面的代码在Python 2& Python 3.它将JSON数据打印到stderr,以便我们验证它是否正确。然后它将Graphviz数据打印到stdout,以便我们可以将其捕获到文件或直接将其传递给Graphviz程序。例如,如果脚本名称为“tree_to_graph.py”,则可以在命令行中执行此操作,将图形保存为名为“tree.png”的PNG文件:
python tree_to_graph.py | dot -Tpng -otree.png
这是PNG输出:
答案 1 :(得分:1)
基于PM 2Ring的答案,我创建了一个可以通过命令行使用的脚本:
npm install -g yo generator-rn-toolbox
yo rn-toolbox:assets --splash IMGAE --android