散景图不会在dropdown.on_change上更新

时间:2019-04-02 23:56:37

标签: python 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 :(得分:0)

仅设置时间段是不够的。您必须再次调用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"