我正在尝试使用滑块进行交互式绘制。该图将按顺序显示年度费用。滑块将更改数据的年份。我想我需要利用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
结果是,我得到了以下内容:位于情节顶部的滑块,但是该情节没有随滑块或标题一起更新。
我看到我在回调内收到警告,说source
变量未使用。
如何获取要根据滑块更改的图和标题?
答案 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方法,才能首先将其转换为期望的格式。