如何用Python+Bokeh Server实现滑块更新圆形半径?
解决Bokeh Server滑块更新圆形半径的500错误问题
看起来你遇到的核心问题是没有正确使用Bokeh的ColumnDataSource管理动态数据,再加上几处API调用的小错误,导致了服务器内部错误。让我一步步帮你修正代码:
问题分析
- 静态变量无法动态更新:你用普通变量
size=20控制圆形大小,但Bokeh无法监听普通变量的变化,必须用ColumnDataSource作为中间层同步前后端数据。 - 滑块绑定参数缺失:
slider.on_change()需要指定要监听的属性(这里是'value'),你漏掉了这个参数,导致回调函数无法正确触发。 - 错误的更新逻辑:尝试修改普通变量的
data属性完全无效,必须更新数据源的data字典才能触发视图更新。 - 冗余的Notebook配置:
output_notebook()是给Jupyter Notebook用的,Bokeh Server独立应用不需要这个配置。
修正后的完整代码
from bokeh.server.server import Server from bokeh.application import Application from bokeh.application.handlers.function import FunctionHandler from bokeh.layouts import column from bokeh.models import Slider, ColumnDataSource from bokeh.plotting import figure # Webpage function, called when creating the webpage def make_page(doc): # 用ColumnDataSource管理动态数据,初始半径设为20(对应两个点) source = ColumnDataSource(data=dict(radius=[20, 20])) def update(attr, old, new): # 更新数据源中的radius值,两个点同步使用滑块的新值 source.data = dict(radius=[new, new]) plot = figure(plot_width=400, plot_height=400) # 将圆形的size绑定到数据源的radius字段 plot.circle([1,2], [4,8], size='radius', color='blue', alpha=0.5, source=source) slider = Slider(start=0, end=30, value=20, step=1, title="Circle Radius") # 监听滑块的value变化,触发update回调 slider.on_change('value', update) # 将滑块和绘图添加到文档 doc.add_root(column(slider, plot)) # 创建应用并启动服务器 apps = {'/': Application(FunctionHandler(make_page))} server = Server(apps, port=5000) server.start() # 可选:添加前台运行代码(脚本运行时需要) print(f"Server running at http://localhost:{server.port}") server.io_loop.start()
关键修改说明
- 引入
ColumnDataSource:这是Bokeh实现交互式更新的核心,所有动态数据都要放在这里,前端会自动监听数据源变化并更新视图。 - 绑定圆形大小到数据源字段:
plot.circle()的size参数使用字符串'radius',表示从source中读取radius字段的值,而非固定数值。 - 正确绑定滑块回调:
slider.on_change('value', update)指定监听滑块的value属性变化,滑块值改变时自动调用update函数。 - 正确更新数据源:在
update函数中修改source.data来更新半径值,Bokeh会自动同步到前端绘图。
运行修正后的代码后,访问http://localhost:5000就能看到可通过滑块调整圆形大小的交互式绘图了。
内容的提问来源于stack exchange,提问作者Deen
相关产品推荐
相关产品推荐

