Python 使用交互式小部件运行Bokeh

Python 使用交互式小部件运行Bokeh,python,widget,bokeh,Python,Widget,Bokeh,我想运行一个带有互动小部件的Bokeh应用程序,但无法使其完全工作 我的代码demo.py: # imports import pandas as pd from bokeh.io import curdoc from bokeh.layouts import column from bokeh.models import ColumnDataSource, Dropdown from bokeh.plotting import figure from bokeh.sampledata.iris

我想运行一个带有互动小部件的Bokeh应用程序,但无法使其完全工作

我的代码
demo.py

# imports
import pandas as pd
from bokeh.io import curdoc
from bokeh.layouts import column
from bokeh.models import ColumnDataSource, Dropdown
from bokeh.plotting import figure
from bokeh.sampledata.iris import flowers

# Data
df = pd.DataFrame({'x': flowers['sepal_length'], 'y': flowers['sepal_width'], 'species': flowers['species']})

# Source
SPECIES = 'versicolor'
source = ColumnDataSource(df.loc[df.species == SPECIES])

# Create plots and widgets
plot = figure()
plot.circle(x= 'x', y='y', source=source)

menu = [("setosa", "setosa"), ("versicolor", "versicolor"), None, ("virginica", "virginica")]
dropdown = Dropdown(label="Dropdown species", button_type="warning", menu=menu)

# Add callback to widgets
def callback(attr, old, new):
    SPECIES = dropdown.value
    source.data=ColumnDataSource(df.loc[df.species == SPECIES])
dropdown.on_change('value', callback)

# Arrange plots and widgets in layouts
layout = column(dropdown, plot)
curdoc().add_root(layout)
当我在命令行界面上用
bokeh-service--show demo.py
运行这个应用程序时,它返回一个带有绘图的HTML页面。下拉列表似乎有效,但当从下拉列表中选择值时,绘图不会更改


有没有解决此问题的建议?

您没有为
源.data
指定正确的值。该值需要是将列名映射到数据列表/数组的常规Python dict。文档和示例中演示了多种方法,但一个好方法是使用CD的
from_df
class方法生成正确类型的dict:

source.data = ColumnDataSource.from_df(df.loc[df.species == SPECIES])
这一行使代码按预期工作

仅供参考,您的代码会在服务器控制台输出中生成错误(如预期的):

处理消息“PATCH-DOC”(修订版1)时出错:ValueError(“应为ColumnData元素(字符串,Seq(Any)),Get ColumnDataSource(id='44e09b5e-133b-4c1b-987b-cbf80b803401',…),)


作为一个温和的建议,在SO问题中包含这样的错误总是一个好主意

感谢您的帮助和温和的建议;-)