2015-07-23 31 views
7

Ho un'applicazione django che utilizza eventualmente visualizzazioni bokeh incorporate.Crea grafici a bokeh con controlli interattivi in ​​django

Proprio ora ottengo utilizzando la funzione bokeh.embed.components e un modello simile:

<body> 
    {{the_div|safe}} 

    {{the_script|safe}} 
</body> 

Grazie a this stackoverflow question.

Il fatto è che ora avrei bisogno di creare più visualizzazioni interattive, aggiungendo cursori, checkbox e altri controlli.

This example sembra quello che voglio, tranne che per un paio di problemi:

  1. Non so come incorporare questo tipo di oggetto all'interno di Django. Direi che this è la strada da percorrere, ma forse non lo è.
  2. Sono un po 'confuso di dover utilizzare il bokeh-server per questo. Non esiste una soluzione javascript pura di facile utilizzo?

Quindi, riassumendo, vorrei sapere qual è l'approccio standard per creare interazioni di grafici dinamici usando django e bokeh.

+0

pura soluzione javascript per i grafici? qualcosa come d3.js? –

+0

Speravo bokeh per creare il file .js dal mio codice Python a un livello superiore. Funziona già abbastanza bene con i miei grafici "più statici". – NublicPablo

+0

Un'alternativa è usare il [BokehJS] (http: //bokeh.pydata.org/it/latest/docs/reference/bokehjs.html) e fare tutto nel client (basta passare i dati usando json). La documentazione è ancora in corso e non è molto facile da usare in questo momento, ma [semplici esempi] (http://jsfiddle.net/bokeh/9GhAp/) sono facili da trovare. – legaultmarc

risposta

2

ci sono due casi d'uso:


senza server di

Se è possibile eseguire aggiornamenti in JS (non è necessario chiamare il codice python vero e proprio), quindi è molto facile per aggiungere interazioni usando CustomJS callbacks. Ci sono un sacco di esempi a quel link, ma un esempio di codice semplice di base assomiglia:

from bokeh.io import vform 
from bokeh.models import CustomJS, ColumnDataSource, Slider 
from bokeh.plotting import Figure, output_file, show 

output_file("callback.html") 

x = [x*0.005 for x in range(0, 200)] 
y = x 

source = ColumnDataSource(data=dict(x=x, y=y)) 

plot = Figure(plot_width=400, plot_height=400) 
plot.line('x', 'y', source=source, line_width=3, line_alpha=0.6) 

callback = CustomJS(args=dict(source=source), code=""" 
    var data = source.get('data'); 
    var f = cb_obj.get('value') 
    x = data['x'] 
    y = data['y'] 
    for (i = 0; i < x.length; i++) { 
     y[i] = Math.pow(x[i], f) 
    } 
    source.trigger('change'); 
""") 

slider = Slider(start=0.1, end=4, value=1, step=.1, 
       title="power", callback=callback) 

layout = vform(slider, plot) 

show(layout) 

che creerà un documento HTML indipendente con una trama Bokeh e un cursore, che aggiorna la trama in reazione al cursore, senza bisogno di un server (ad esempio, potresti inviarlo via email a qualcuno o servirlo su una pagina statica e funzionerebbe).


con il server

Se si desidera che il widget, interazioni, ecc per guidare codice Python effettivo (ad esempio scikit-learn, o Pandas) allora avete bisogno di utilizzare il server Bokeh. Fortunatamente il nuovo server dalla versione 0.11 è molto più robusto, performante, scalabile e semplice da usare. Si può vedere diverse applicazioni Bokeh schierate dal vivo (con link al loro codice sorgente) qui:

http://demo.bokehplots.com/

Oltre a una vasta documentazione su vari tipi di implementazioni nella documentazione qui:

http://bokeh.pydata.org/en/0.11.1/docs/user_guide/server.html

+0

Sembra che 'CustomJS' è quello che stavo cercando, ma mi sembra che sia stato aggiunto dopo che ho fatto la domanda. Solo per completezza, da quale versione è disponibile? – NublicPablo

+0

Una versione precedente apparve in '0.9' ma la versione corrente era presente da' 0.10' – bigreddot