gpt4 book ai didi

python - 如何在 jupyter 笔记本中使用 Bokeh 将多选小部件链接到数据表?

转载 作者:行者123 更新时间:2023-11-30 22:13:17 25 4
gpt4 key购买 nike

我正在尝试将数据表与 Bokeh 中的多选小部件连接起来。我四处搜寻并发现我需要开发一个功能来更新数据表的数据源,但我似乎有两个问题。

  1. 单击多选对象后,我似乎无法访问它的值。
  2. 收到更改后,我似乎无法将更改推送到笔记本。

这是我的代码示例:

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 没有用(无需更多工作,请参见下文)如果您想要这种交互,有几个选项:

  • ipywidgetspush_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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com