Does a DynamicMap callable always have to return the same type?

123 views Asked by At

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)
1

There are 1 answers

1
mdk On BEST ANSWER

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)