使用滑块回调从SQL更新Bokeh图

时间:2019-08-02 21:05:10

标签: python sql plot bokeh

我正在尝试使用滑块进行交互式绘制。该图将按顺序显示年度费用。滑块将更改数据的年份。我想我需要利用Bokeh服务器。

使用熊猫,我从本地MySQL服务器运行查询并获得以下类型的表。

         CATEGORY    TOTAL
0             Foo    11.00
1             Bar    51.37
2          Foobar   114.86

几乎可以运行的代码。

#SliderTest.py

#Init
year = 2012
query = SqlCmds.R_YearlyTopExpenses(year)
source = pd.read_sql_query(query, con=connection)

# Create plots and widgets
plot = figure(
    y_range=source['CATEGORY'],
    x_axis_label='Amount',
    y_axis_label='Category',
    plot_width=800
    )

plot.hbar(
    y=source['CATEGORY'],
    right=source['TOTAL'],
    left=0,
    height=0.5
    )

slider = Slider(
    start=2012,
    end=2019,
    value=2012,
    step=1,
    title="Year"
    )

# Add callback to widgets
def callback(attr, old, new):
    year = slider.value

    query = SqlCmds.R_YearlyTopExpenses(year)
    new_data = pd.read_sql_query(query, con=connection) #changed
    source.data = new_data #added

slider.on_change('value', callback)

# Arrange plots and widgets in layouts
layout = column(slider, plot)
curdoc().add_root(layout)

我运行以下命令

bokeh serve --show .\SliderTest.py

结果是,我得到了以下内容:位于情节顶部的滑块,但是该情节没有随滑块或标题一起更新。

Slider does not update the plot

我看到我在回调内收到警告,说source变量未使用。

如何获取要根据滑块更改的图和标题?

1 个答案:

答案 0 :(得分:1)

当您这样做:

source = pd.read_sql_query(query, con=connection)

在函数内部,您正在创建一个新的纯局部变量,该变量与上面定义的source完全相关,然后在函数退出时立即被丢弃(这是关于警告的原因它没有被使用)。但是,即使忽略了这一点,也不是最好的方法来批量替换Bokeh ColumnDataSource对象。相反,您需要做的是更新现有源:

source.data = new_data

如果您使用的是散景> = 1.3,那么new_data可以直接是Pandas DataFrame。否则,您必须调用DataFrame上的ColumnDatatSource.data_from_df(...) statif方法,才能首先将其转换为期望的格式。