Я столкнулся с чем-то очень странным, когда имел функцию, которая генерирует NdOverlay точек для DynamicMap, где функция привязана к виджетам панели (я не думаю, что виджеты панели важны).
Приведенный ниже код является рабочим примером, который дает ожидаемое поведение. Каждый раз, когда вы меняете значения виджета, создается новый график с наложенными двумя наборами точек, с разными цветами и соответствующими записями легенды. Изображение показано под кодом.
a_widget = pn.widgets.Select(name='A', options=[1,2,3,4])
b_widget = pn.widgets.IntSlider(name='B', start=10, end=20, value=10)
widget_box = pn.WidgetBox(a_widget, b_widget, align='center')
@pn.depends(a=a_widget.param.value, b=b_widget.param.value)
def get_points(a, b):
return hv.NdOverlay({x: hv.Points(np.random.rand(10,10)) for x in range(1,3)})
points = hv.DynamicMap(get_points)
pn.Row(widget_box, points)
Второй пример, показанный ниже, предназначен для демонстрации того, что в определенных ситуациях вам может потребоваться просто вернуть пустой график, и то, как я сделал это в этом примере, выполняется так же, как в этом примере: http://holoviews.org/gallery/demos/bokeh/box_draw_roi_editor.html#bokeh-gallery-box-draw-roi-editor Результатом этого кода является пустой график, как и ожидалось, когда a == 1
, но когда a
имеет значения, отличные от 1
, результат довольно странный как показано на изображении под кодом.
- Все точки имеют одинаковый цвет
- Например, при изменении ползунка некоторые точки замораживаются и никогда не меняются, чего нет в приведенном выше рабочем примере.
a_widget = pn.widgets.Select(name='A', options=[1,2,3,4])
b_widget = pn.widgets.IntSlider(name='B', start=10, end=20, value=10)
widget_box = pn.WidgetBox(a_widget, b_widget, align='center')
@pn.depends(a=a_widget.param.value, b=b_widget.param.value)
def get_points(a, b):
if a == 1:
return hv.NdOverlay({None: hv.Points([])})
else:
return hv.NdOverlay({x: hv.Points(np.random.rand(10,10)) for x in range(1,3)})
points = hv.DynamicMap(get_points)
pn.Row(widget_box, points)