2014-09-24 7 views
8

Kliknięcie przycisku "w górę" w poniższym kodzie tworzy ciąg cyfr zamiast aktualizowania istniejącej figury. Jak zaktualizować istniejącą figurę?bokeh z widżetem IPython Notatnik: dodatkowe liczby wyglądające na

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

Czy chcesz mieć jeden dział z jedną linią, który aktualizuje pojedynczą linię, gdy przyciski są wciśnięte? A może chcesz drukować z potencjalnie wieloma liniami, który dodaje nowe linie po naciśnięciu przycisków? – bigreddot

+0

Obaj przypuszczam. Wybierzmy pierwszy. Najważniejsze, że chcę jednej działki niewiele. – mathtick

+0

Kanoniczny sposób na to obejmuje serwer bokeh. Zatrzymujesz źródło danych dla działki, a następnie aktualizujesz je i przekazujesz do serwera, a wykres aktualizuje się automatycznie. Oto przykład: https://github.com/ContinuumIO/bokeh/blob/master/examples/plotting/notebook/animated.ipynb To powiedziawszy, myślę, że byłoby możliwe dodanie funkcji, która rysuje wykres w notesie IPython, ale nie sądzę, że jest to obecnie możliwe w jakikolwiek prosty sposób. – bigreddot

Odpowiedz

0

I rzeczywiście dostał go do pracy z ipywidgets funkcji interact

ten sposób za każdym razem wchodzić w interakcje z widget fabuła bokeh będą przeładowywane zamiast nową dołączany do istniejącego.

Tutaj minimalny przykład, drobne aktualizacje, aby pracować z nowymi wersjami:

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) 

PS: Widzę tę starą odpowiedź. Jeśli w międzyczasie znalazłeś inne rozwiązanie, daj mi znać.