боке с виджетом IPython Notebook: появляются дополнительные фигуры

Нажатие кнопки «вверх» в следующем коде создает последовательность рисунков, а не обновляет существующий рисунок. Как обновить существующую фигуру?

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)

person mathtick    schedule 24.09.2014    source источник
comment
Вам нужен один график с одной линией, который обновляет одну строку при нажатии кнопок? Или вам нужен сюжет с потенциально большим количеством строк, который добавляет новые строки при нажатии кнопок?   -  person bigreddot    schedule 25.09.2014
comment
Оба, я полагаю. Давайте выберем первое. Главное, я хочу один сюжет, а не много.   -  person mathtick    schedule 25.09.2014
comment
Канонический способ сделать это — использовать боке-сервер. Вы сохраняете источник данных для графика, а затем обновляете его и отправляете на сервер, и график обновляется автоматически. Вот пример: github.com/ContinuumIO/bokeh /blob/master/examples/plotting/ Тем не менее, я думаю, что было бы возможно добавить функцию, которая перерисовывает график в блокноте IPython на месте, но я не верю, что в настоящее время это возможно в любым простым способом.   -  person bigreddot    schedule 27.09.2014


Ответы (1)


На самом деле я заставил его работать с функцией ipywidgets interact

Таким образом, каждый раз, когда вы взаимодействуете с widget, график боке будет перезагружаться вместо добавления нового к существующему.

Вот минимальный пример с небольшими обновлениями, чтобы он работал с новыми версиями:

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. Я вижу это старый ответ. Если за это время вы нашли другое решение, пожалуйста, дайте мне знать.

person Framester    schedule 23.03.2016