Для такого дерева нет необходимости использовать библиотеку: вы можете напрямую создавать операторы языка Graphviz DOT. Единственная сложная часть - извлечение ребер дерева из данных JSON. Для этого мы сначала преобразуем строку JSON обратно в Python dict
, а затем проанализируем, что dict
рекурсивно.
Если имя в дереве dict не имеет детей, это простая строка, в противном случае это dict, и нам нужно сканировать элементы в своем списке "children"
. Каждая найденная (родительская, дочерняя) пара добавляется в глобальный список edges
.
Это зашифрованное линия:
name = next(iter(treedict.keys()))
получает один ключ от . Это дает нам имя человека, поскольку это единственный ключ в . В 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 verfiy 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"
]
}
}
]
}
}
вывода STDOUT
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», вы можете сделать это в командной строке, чтобы сохранить график в виде PNG-файла с именем «tree».PNG ":
python tree_to_graph.py | dot -Tpng -otree.png
А вот выход PNG:
вы посмотрели на сюжет https://plot.ly/python/tree-plots/ – corn3lius
@ corn3lius, Нет, не видели этого раньше, можете ли вы мне помочь? Я новичок в JSON! – Grimlock
BTW, версия JSON 'with_data = False' соответствует дереву вашего изображения, но версия' with_data = True' не имеет. –