Python 如何通过更改Bokeh图形中的选择来替换面板的一部分?

Python 如何通过更改Bokeh图形中的选择来替换面板的一部分?,python,bokeh,holoviz,pyviz,panel-pyviz,Python,Bokeh,Holoviz,Pyviz,Panel Pyviz,通常,我可以通过pop和insert替换面板的部件,这会自动更新任何现有面板。但是,如果这些是从所选的bokeh上触发的。在_change回调上, 现有面板不会更新 例如,在JupyterLab中运行以下命令是可行的 来自bokeh.plotting导入图的 来自bokeh.sampledata.iris导入花 从bokeh.models导入ColumnDataSource 作为pn导入面板 请注意:扩展部分() def create_figure(): src=ColumnDataSource

通常,我可以通过
pop
insert
替换面板的部件,这会自动更新任何现有面板。但是,如果这些是从所选的bokeh
上触发的。在_change
回调上, 现有面板不会更新

例如,在JupyterLab中运行以下命令是可行的

来自bokeh.plotting导入图的

来自bokeh.sampledata.iris导入花
从bokeh.models导入ColumnDataSource
作为pn导入面板
请注意:扩展部分()
def create_figure():
src=ColumnDataSource(花卉)
p=图形(高度=200,宽度=200,工具=box\u选择)
p、 圆(“花瓣长度”、“花瓣宽度”,源=src)
返回p
pnl=零件面板(零件行(创建零件图,创建零件图))
pnl
在下一个单元格中运行以下操作时,显示的面板将按预期更新:

pnl.pop(0)
pnl.插入(0,图)
但是,如果在列数据源的选择更改时通过回调执行相同的操作,则面板不会在我在绘图中选择数据点时更新:

def replace_图(属性、旧、新):
pnl.objects.pop(0)
pnl.objects.insert(0,图)
def create_figure():
src=ColumnDataSource(花卉)
p=图形(高度=200,宽度=200,工具=box\u选择)
p、 圆(“花瓣长度”、“花瓣宽度”,源=src)
src.selected.on_change('index',replace_plot)
返回p
pnl=零件面板(零件行(创建零件图,创建零件图))
pnl
工作原理是用新列表替换整个
pnl.objects

def replace_图(属性、旧、新):
pnl.objects=[图]
奇怪的是,只有当我调用
pnl.show()
以在新的浏览器选项卡中显示面板时,这才起作用。在笔记本中,我需要在新单元格中再次显示面板以查看更新。我尝试通过索引替换
对象
列表中的单个项目,但其效果与
弹出
插入
相同,面板没有自动更新

是否有办法更换所选面板vi的部件。在_change回调时自动刷新(最好在笔记本内,但通过
show
也可以)

版本:

-----
bokeh       2.0.1
pandas      1.0.3
panel       0.9.5
-----
IPython             6.5.0
jupyter_client      5.2.3
jupyter_core        4.6.3
jupyterlab          2.1.0
notebook            5.6.0
-----
Python 3.7.6 | packaged by conda-forge | (default, Mar 23 2020, 23:03:20) [GCC 7.3.0]
Linux-5.6.13-arch1-1-x86_64-with-arch
4 logical CPU cores
-----
Session information updated at 2020-05-21 18:38

原来这是面板中的一个bug,现在正在跟踪。目前,以下代码片段可以解决这个问题:

从panel.io.notebook导入推送
def替换图(属性、旧、新):
对于pnl.\U型号中的ref:
_,u,doc,comm=pn.state._视图[ref]
霍尔德博士
pnl[0]=1
推送(文档、通信)
对于pnl.\U型号中的ref:
_,u,doc,comm=pn.state._视图[ref]
文件编号()

我不知道答案,但是如果你没有得到这个问题的答案,那么你也可以尝试将你的问题发布到Thank@Sandervandeoord上,我之前在网站上打开过一个。