问题描述
我想在 Jupyter Notebook 中工作,尽管该项目只有一个情节。用新数据或新布局更新它,也许在它附近添加/删除其他绘图等等......在散景中我可以使用类似于:
target = show(layout,notebook_handle=True)
push_notebook(handle=target)
在 Holoviews 中,我发现了如何向现有绘图提供新数据:
pipe = Pipe(data=[])
Image = hv.DynamicMap(hv.Image,streams=[pipe1])
pipe.send(np.random.rand(3,2)) #data change
但是有没有什么解决方案可以在 Holoviews 中管理实时布局更新?是否可以通过 .opts() 构造更新现有图?在这个例子中,我将得到一个新的情节:
pipe = Pipe(data=[])
Image = hv.DynamicMap(hv.Image,streams=[pipe])
Image.opts(width=1000,height=1000)
#######new cell in jupyter notebook############
Image.opts(width=100,height=100)
解决方法
这是我对我的问题的精彩回答:
import param
import panel as pn
import numpy as np
import holoviews as hv
from holoviews.streams import Pipe
pn.extension()
pipe = Pipe(data=[])
class Layout(param.Parameterized):
colormap = param.ObjectSelector(default='viridis',objects=['viridis','fire'])
width = param.Integer(default=500)
update_data = param.Action(lambda x: x.param.trigger('update_data'),label='Update data!')
@param.depends("update_data",watch=True)
def _update_data(self):
pipe.send(np.random.rand(3,2))
layout = Layout()
Image = hv.DynamicMap(hv.Image,streams=[pipe]).apply.opts(cmap=layout.param.colormap,width=layout.width)
pdmap = pn.panel(Image)
playout = pn.panel(layout)
def update_width(*events):
for event in events:
if event.what == "value":
pdmap.width = event.new
layout.param.watch(update_width,parameter_names=['width'],onlychanged=False)
pn.Row(playout,pdmap)
https://discourse.holoviz.org/t/how-to-update-holoviews-plots-width-height/1947