2013-01-25 20 views
13

Qualcuno sa di qualsiasi libreria Python che ti permette di alimentare semplicemente e velocemente un oggetto annidato a livelli arbitrari, come ad esempio un albero di dict lungo le linee di cosa potresti trovare in this gist e può sputare un file grafico dell'albero lavorabile?Libreria Python per la creazione di grafici ad albero da oggetti Python annidati (dicts)

La semplicità è la chiave, qui, dal momento che devo essere in grado di lavorare con persone che non hanno una mente tecnica.

Cosa intendo per "albero grafico" è qualcosa sulla falsariga di quanto segue, dove ho potuto dargli da mangiare un dizionario annidata di valori e sarebbe quindi creare la struttura ad albero:

http://dhaka.rubyforge.org/parse_tree.jpg

+0

Puoi dire di più su cosa intendi per "file grafico ad albero?" Un esempio di input/output e alcuni commenti su come si desidera utilizzare l'output sarebbe di grande aiuto. – neirbowj

+0

@neirbowj buon commento, grazie; aggiornato – jdotjdot

risposta

3

quindi la libreria che consiglio e utilizzo per il mio snippet di codice in questa risposta è non una libreria python, ma è una libreria python-friendly, con cui intendo che il codice che usa questa libreria può essere inserito in un python modulo per l'elaborazione dei dati e questo codice estero si collegherà al codice Python extant su entrambe le estremità, cioè, sia input che output, e sospetto, anche se ovviamente non lo so, questo è tutto ciò che è realmente inteso dalla "libreria python" "criterio. Quindi, se stai scrivendo un'app Web, questo codice sarebbe sul lato client. In altre parole, questa libreria non è Python, ma funziona con Python.

  1. suo ingresso è (quasi) dicts pitone prime, più specificamente, json.load (a_python_dict) restituisce una matrice JSON o un oggetto, un formato che questa libreria javascript naturalmente può riconoscere; e

  2. il formato di output è HTML o SVG, non gli oggetti in qualche formato linguaggio specifico

è possibile utilizzare d3.js.Ha un class specificamente per gli alberi di rendering:

var tree = d3.layout.tree().size([h, w]); 

C'è anche un paio di esempi di alberi (codice di lavoro) nella cartella esempio nella fonte d3, che è possibile clonare/scarica il modulo del link ho fornito sopra.

Poiché d3 è una libreria javascript, il suo formato di dati nativi è JSON.

La struttura di base è un dizionario annidata, ogni dizionario rappresenta un singolo nodo con due valori, il nome del nodo e suoi figli (memorizzato in un array), calettato nomi e bambini, rispettivamente :

{"name": "a_root_node", "children": ["B", "C"]} 

e, naturalmente, è semplice per la conversione tra dizionari di pitone e JSON:

>>> d = {"name": 'A', "children": ['B', 'C']} 
>>> import json as JSON 
>>> dj = JSON.dumps(d) 
>>> dj 
    '{"name": "A", "children": ["B", "C"]}' 

ecco un pitone dizionario rappresentazione di un albero grande (una decina di nodi) che ho convertito a JSON come sopra, e quindi resi in d3 come l'albero mostrato in figura:

tree = {'name': 'root', 'children': [{'name': 'node 2', 'children': 
     [{'name': 'node 4', 'children': [{'name': 'node 10', 'size': 7500}, 
     {'name': 'node 11', 'size': 12000}]}, {'name': 'node 5', 'children': 
     [{'name': 'node 12', 'children': [{'name': 'node 16', 'size': 10000}, 
     {'name': 'node 17', 'size': 12000}]}, {'name': 'node 13', 'size': 5000}]}]}, 
     {'name': 'node 3', 'children': [{'name': 'node 6', 'children': 
     [{'name': 'node 14', 'size': 8000}, {'name': 'node 15', 'size': 9000}]}, 
     {'name': 'node 7', 'children': [{'name': 'node 8', 'size': 10000}, 
     {'name': 'node 9', 'size': 12000}]}]}]} 

tree represented as python dictionary rendered in d3:

nota: d3 rende nel del browser; l'immagine sopra è solo una schermata della finestra del mio browser.

+8

-1: D3 è ottimo e tutto, ma è uno strumento * Javascript *, non Python. Non è di grande aiuto se stai codificando Python. –

+0

Ama questa risposta. Finalmente ho un modo pulito per visualizzare l'output da uno script python! – Andrew

5

I Non sono sicuro che sia proprio quello che hai in mente, ma è la prima cosa che ti viene in mente.

blockdiag è principalmente destinato ad essere utilizzato come un file processor autonomo simile a Graphviz (per cui esiste un'interfaccia Python). Accetta un file di testo come input con una semplice sintassi drop-dead e produce immagini come output.

Dovresti essere in grado di scrivere un semplice shim per stampare la tua struttura dict ricorsiva formattata per l'input allo script blockdiag standalone, o importare gli interi necessari del pacchetto blockdiag e guidare direttamente l'output.

Se questo sembra promettente, vedrò se riesco a tirar fuori del codice di esempio.

modificare il codice Esempio:

def print_blockdiag(tree, parent=None): 
    if not parent: print('blockdiag { orientation = portrait') 
    for key in tree: 
     if parent: print(' {} -> {};'.format(parent, key)) 
     print_blockdiag(tree[key], key) 
    if not parent: print('}') 

Questa uscita volontà di un file che blockdiag in grado di leggere.

-3

A seconda di cosa è necessario, ma se è necessario solo per visualizzare facilmente il contenuto, è possibile utilizzare lo strumento online per tale scopo: "Python dict formatter and viewer" può eseguire il rendering di un dettato come albero.

+1

Ho provato questo e mostra solo un elenco html. –

Problemi correlati