2014-09-24 19 views
8

Facendo clic sul pulsante "su" nel seguente codice si produce una sequenza di cifre anziché aggiornare la figura esistente. Come si aggiorna una figura esistente?bokeh con widget di IPython Notebook: figure addizionali in riproduzione

from IPython.html import widgets 
import bokeh.plotting as bp 
from IPython.display import display 
from numpy.random import randn 
bp.output_notebook() 

m = 1000 
n = 1000 
df = pandas.DataFrame(randn(m, n)).cumsum() 

bp.hold() 
bp.figure(figsize=(4, 8)) 


def doplot(i): 
    bp.line(df.index, df.icol(i), color='red', legend='here') 
    bp.show() 

class A: 
    def __init__(self): 
     self.i = 0 
     self.doplot() 
    def incr(self, something): 
     self.i += 1 
     print(self.i) 
     self.doplot() 
    def decr(self, something): 
     self.i -= 1 
     self.doplot() 
    def doplot(self): 
     doplot(self.i) 
a = A() 
button = widgets.ButtonWidget(description='up') 
button.on_click(a.incr) 
buttond = widgets.ButtonWidget(description='down') 
buttond.on_click(a.decr) 

display(button) 
display(buttond) 
+0

Vuoi un grafico con una riga, che aggiorna la singola riga quando i pulsanti vengono premuti? O vuoi la trama desiderata, con potenzialmente molte linee, che aggiunge nuove linee quando vengono premuti i pulsanti? – bigreddot

+0

Entrambi suppongo. Prendiamo il primo La cosa principale è che voglio una trama non molte. – mathtick

+0

Il modo canonico per fare ciò riguarda il server bokeh. Mantenere l'origine dei dati per il grafico, quindi aggiornarlo e inviarlo al server, e la trama si aggiorna automaticamente. Ecco un esempio: https://github.com/ContinuumIO/bokeh/blob/master/examples/plotting/notebook/animated.ipynb Detto questo, penso che sarebbe possibile aggiungere una funzione che ri- traccia una trama nel notebook IPython, ma non credo che questo sia attualmente possibile in alcun modo semplice. – bigreddot

risposta

0

realtà ho preso a lavorare con la funzione di ipywidgetsinteract

In questo modo ogni volta che si interagisce con un widget la trama bokeh verrà ricaricata al posto di uno nuovo viene aggiunto a quello esistente.

Ecco un esempio minimo, con aggiornamenti minori per farlo funzionare con le nuove versioni:

import ipywidgets 
import bokeh.plotting as bp 
from IPython.display import display 
from numpy.random import randn 
import pandas 
bp.output_notebook() 

m = 1000 
n = 1000 

df = pandas.DataFrame(randn(m, n)).cumsum() 

def create_plot(swapp_axis): 
    fig = bp.figure() 
    if swapp_axis: 
     fig.scatter(df.icol(0), df.index) 
    else: 
     fig.scatter(df.index, df.icol(0)) 
    bp.show(fig) 

swapp_axis = ipywidgets.Checkbox(
    description='swapp_axis',  
    value=False)          

ipywidgets.interact(create_plot, swapp_axis=swapp_axis) 

P.S. Vedo questa una vecchia risposta. Se nel frattempo hai trovato un'altra soluzione, faccelo sapere.