Фигура Боке не обновляется на dropdown.on_change - PullRequest
0 голосов
/ 03 апреля 2019

У меня возникла проблема с обновлением графика Bokeh.Это простой кусок кода, одна фигура с одной кривой и один выпадающий список, который может изменить период времени, 7,10 и 30 дней.Когда я меняю значение выпадающего меню, ничего не происходит.Я уже просмотрел различные статьи, но не нашел для меня четкого ответа.Пример кода представлен ниже.Спасибо

from bokeh.plotting import figure
from bokeh.layouts import row
from bokeh.io import curdoc
from bokeh.models import ColumnDataSource
from bokeh.models.widgets import Dropdown
from pandas_datareader import data
import datetime


TIME_PERIOD = 30

def get_data(period):
    today = datetime.date.today()
    timedelta = datetime.timedelta(days=period)
    start = today - timedelta
    df = data.DataReader(name="BTC-USD", data_source="yahoo", start=start)
    dates = df.loc[str(start):str(today)].index
    y = df["Volume"]
    data1 = dict(
        xaxis=dates,
        yaxis=y
    )
    source = ColumnDataSource(data1)
    return source


def update_date(attr, old, new):
    global TIME_PERIOD
    temp = new
    TIME_PERIOD = int(temp)


def get_plot(data_source):
    p = figure(title="Cryptocurrencies volumes", x_axis_label="Дни", y_axis_label="Volume 24hr",
               x_axis_type="datetime")
    p.line(x="xaxis", y="yaxis", color="green", source=data_source)
    return p

dropdown_menu = [("7","7"),("10","10"),("30","30")]
dropdown = Dropdown(label="Выбор временного интервала",button_type="success",menu=dropdown_menu, value="30")
dropdown.on_change("value", update_date)

data1 = get_data(TIME_PERIOD)
plot = get_plot(data1)

image = row(dropdown,plot)

curdoc().add_root(image)
curdoc().title = "Plot"

1 Ответ

0 голосов
/ 03 апреля 2019

Недостаточно просто установить период времени. Вы должны снова вызвать функцию get_data() и установить данные ColumnDataSource, которые она возвращает в качестве данных ColumnDataSource, используемых вашим глифом строки.

from bokeh.plotting import figure
from bokeh.layouts import row
from bokeh.io import curdoc
from bokeh.models import ColumnDataSource
from bokeh.models.widgets import Dropdown
from pandas_datareader import data
import datetime

TIME_PERIOD = 30

def get_data(period):
    today = datetime.date.today()
    timedelta = datetime.timedelta(days=period)
    start = today - timedelta
    df = data.DataReader(name="BTC-USD", data_source="yahoo", start=start)
    dates = df.loc[str(start):str(today)].index
    y = df["Volume"]
    data1 = dict(
        xaxis=dates,
        yaxis=y
    )
    source = ColumnDataSource(data1)
    return source


def update_date(attr, old, new):
    TIME_PERIOD = int(new)
    newdata = get_data(TIME_PERIOD)
    source.data = newdata.data

dropdown_menu = [("7","7"),("10","10"),("30","30")]
dropdown = Dropdown(label="Выбор временного интервала",button_type="success",menu=dropdown_menu, value="30")
dropdown.on_change("value", update_date)

source = get_data(TIME_PERIOD)
p = figure(title="Cryptocurrencies volumes", x_axis_label="Дни", y_axis_label="Volume 24hr",
           x_axis_type="datetime")
p.line(x="xaxis", y="yaxis", color="green", source=source)

image = row(dropdown,p)

curdoc().add_root(image)
curdoc().title = "Plot"
...