The below code makes it seem like the callable passed to a DynamicMap can not change the Element type. When changing the category widget to B
a Curve
element is returned instead of Points
, but the plot is just empty. Is this behavior not supported or is there some opts
magic that is required to make it work?
import holoviews as hv
import numpy as np
import panel as pn
hv.extension('bokeh')
from IPython.core.display import display, HTML
display(HTML("<style>.container { width:100% !important; }</style>"))
main_category_widget = pn.widgets.Select(name='Main category', options=['A','B'], value='A')
widgets = main_category_widget
@pn.depends(selected_main_category=main_category_widget.param.value)
def get_points(selected_main_category):
if selected_main_category == 'A':
return hv.Points(np.random.rand(5,5)).opts(size=10, title='Points')
else:
return hv.Curve(np.random.rand(5,5)).opts(title='Curve')
points = hv.DynamicMap(get_points).opts(height=400, width=800)
pn.Row(widgets, points)
Using hv.Overlay
as return type of get_points()
your code is working as expected:
import holoviews as hv
import numpy as np
import panel as pn
hv.extension('bokeh')
main_category_widget = pn.widgets.Select(name='Main category', options=['Points','Curve'], value='Points')
@pn.depends(selected_main_category=main_category_widget.param.value)
def get_points(selected_main_category):
images = []
if selected_main_category == 'Points':
images.append(hv.Points(np.random.rand(5,5)).opts(size=10, title='Points'))
else:
images.append(hv.Curve(np.random.rand(5,5)).opts(title='Curve'))
return hv.Overlay(images)
points = hv.DynamicMap(get_points).opts(height=400, width=800)
pn.Row(main_category_widget, points)