- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试将数据表与 Bokeh 中的多选小部件连接起来。我四处搜寻并发现我需要开发一个功能来更新数据表的数据源,但我似乎有两个问题。
这是我的代码示例:
import pandas as pd
from bokeh.io import push_notebook
from bokeh.plotting import show, output_notebook
from bokeh.layouts import row
from bokeh.models.widgets import MultiSelect, DataTable, TableColumn
from bokeh.models import ColumnDataSource
output_notebook()
df=pd.DataFrame({'year':[2000,2001,2000,2001,2000,2001,2000,2001],
'color':['red','blue','green','red','blue','green','red','blue'],
'value':[ 0,1,2,3,4,5,6,7]})
columns=[TableColumn(field=x, title=x) for x in df.columns]
source=ColumnDataSource(df)
data_table=DataTable(source=source,columns=columns)
years=[2000,2001,2000,2001,2000,2001,2000,2001]
## MultiSelect won't let me store an integer value, so I convert them to strings
multi=MultiSelect(title="Select a Year", value=['2000','2001'],options=[str(y) for y in set(years)])
def update(attr,old, new):
yr=multi.value
yr_vals=[int(y) for y in yr]
new_data=df[df.year.isin(yr_vals)]
source.data=new_data
push_notebook(handle=t)
multi.on_change('value',update)
t=show(row(multi,data_table),notebook_handle=True)
最佳答案
push_notebook
是单向的。也就是说,您只能将更改从 IPython 内核推送到 JavaScript 前端。 UI 中的任何更改都不会传播回正在运行的 Python 内核。换句话说,on_change
没有用(无需更多工作,请参见下文)如果您想要这种交互,有几个选项:
将ipywidgets
与push_notebook
结合使用。通常,这涉及到 interact 函数来自动生成一个带有回调的简单 UI,该回调使用 push_notebook
根据小部件值更新绘图等。需要明确的是,此方法使用 ipywidgets
,它们不是 Bokeh 内置小部件。您可以在此处查看完整的示例笔记本:
https://github.com/bokeh/bokeh/blob/master/examples/howto/notebook_comms/Jupyter%20Interactors.ipynb
嵌入 Bokeh 服务器应用程序。 Bokeh 服务器使 Bokeh 小部件上的 on_change
回调能够发挥作用。通常,这涉及创建一个定义应用程序的函数(通过指定如何创建新文档):
def modify_doc(doc):
df = sea_surface_temperature.copy()
source = ColumnDataSource(data=df)
plot = figure(x_axis_type='datetime', y_range=(0, 25))
plot.line('time', 'temperature', source=source)
def callback(attr, old, new):
if new == 0:
data = df
else:
data = df.rolling('{0}D'.format(new)).mean()
source.data = ColumnDataSource(data=data).data
slider = Slider(start=0, end=30, value=0, step=1, title="Smoothing by N Days")
slider.on_change('value', callback)
doc.add_root(column(slider, plot))
然后在该函数上调用show
:
show(modify_doc)
完整的示例笔记本在这里:
https://github.com/bokeh/bokeh/blob/master/examples/howto/server_embed/notebook_embed.ipynb
(Hacky 选项)有些人将 CustomJS
回调与 Jupyers JS 函数 kernel.execute
结合起来,将值传播回内核。
关于python - 如何在 jupyter 笔记本中使用 Bokeh 将多选小部件链接到数据表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50826750/
我正在开发一个 voip 调用应用程序。我需要做的是在接到来电时将 Activity 带到前台。我在应用程序中使用 Twilio,并在收到推送消息时开始调用。 问题是我试图在接到任何电话时显示 Act
我是一名优秀的程序员,十分优秀!