Für einen Baum wie diesen ist es nicht notwendig, eine Bibliothek zu verwenden: Sie können die Sprachanweisungen von Graphviz DOT direkt generieren. Der einzige knifflige Teil ist das Extrahieren der Baumkanten aus den JSON-Daten. Um dies zu tun, konvertieren wir zuerst die JSON-Zeichenfolge zurück in eine Python dict
, und dann rekursiv diese dict
.
Wenn ein Name in der Struktur dict keine Kinder hat, ist es eine einfache Zeichenfolge, ansonsten ist es ein Diktat und wir müssen die Elemente in seiner "children"
Liste scannen. Jedes (Eltern-, Kind-) Paar, das wir finden, wird an eine globale Liste angehängt edges
.
Diese etwas kryptische Zeile:
name = next(iter(treedict.keys()))
bekommt einen Schlüssel aus . Dies gibt uns den Namen der Person, da dies der einzige Schlüssel in ist. In Python 2 konnten wir
name = treedict.keys()[0]
tun, aber der vorherige Code funktioniert in beide Python 2 und 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 Ausgabe
{
"Harry": {
"children": [
"Bill",
{
"Jane": {
"children": [
{
"Diane": {
"children": [
"Mary"
]
}
},
"Mark"
]
}
}
]
}
}
stdout Ausgabe
strict digraph tree {
Harry -> Bill;
Harry -> Jane;
Jane -> Diane;
Diane -> Mary;
Jane -> Mark;
}
Der obige Code läuft auf Python 2 & Python 3. Es druckt die JSON-Daten auf stderr, damit wir überprüfen können, ob es korrekt ist. Anschließend werden die Graphviz-Daten in stdout ausgedruckt, sodass wir sie in einer Datei erfassen oder direkt an ein Graphviz-Programm leiten können. Wenn das Skript beispielsweise den Namen "tree_to_graph.py" hat, können Sie dies in der Befehlszeile tun, um das Diagramm als PNG-Datei mit dem Namen "tree" zu speichern.png ":
python tree_to_graph.py | dot -Tpng -otree.png
Und hier ist das PNG-Ausgang:
![Tree made by Graphviz Tree made by Graphviz](https://i.stack.imgur.com/zFvic.png)
Haben Sie plotly angeschaut https://plot.ly/python/tree-plots/ – corn3lius
@ corn3lius, Nein, habe es noch nicht gesehen, können Sie mir dabei helfen? Ich bin neu in JSON! – Grimlock
BTW, die 'with_data = False'-Version von JSON stimmt mit dem Baum in Ihrem Bild überein, aber die' with_data = True'-Version nicht. –