Python 函数将NdOverlay返回到DynamicMap时的奇怪行为

Python 函数将NdOverlay返回到DynamicMap时的奇怪行为,python,holoviews,pyviz,Python,Holoviews,Pyviz,我遇到了一些非常奇怪的事情,当我使用一个函数生成指向DynamicMap的点的nOverlay时,该函数与面板小部件相关联(我认为面板小部件并不重要) 下面的代码是一个产生预期行为的工作示例。每当您更改小部件值时,都会生成一个新的绘图,其中两组点重叠,具有不同的颜色和各自的图例条目。下图显示了代码 a_widget = pn.widgets.Select(name='A', options=[1,2,3,4]) b_widget = pn.widgets.IntSlider(name='B',

我遇到了一些非常奇怪的事情,当我使用一个函数生成指向DynamicMap的点的nOverlay时,该函数与面板小部件相关联(我认为面板小部件并不重要)

下面的代码是一个产生预期行为的工作示例。每当您更改小部件值时,都会生成一个新的绘图,其中两组点重叠,具有不同的颜色和各自的图例条目。下图显示了代码

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)

下面显示的第二个示例旨在说明在某些情况下,您可能只想返回一个空绘图,而我在本例中所使用的方法与本例中的方法相同: 当
a==1
时,此代码的结果是预期的空图,但当
a
具有除
1
以外的值时,结果非常奇怪,如代码下方的图像所示

  • 这些点都有相同的颜色
  • 例如,当更改滑块时,某些点被冻结且永远不会更改,而上述工作示例中的情况并非如此

  • 虽然我无法通过
    nOverlay解决观察到的问题,但可以通过
    覆盖
    来创建包含或不包含内容的绘图

    由于
    b_widget
    从未在您的代码中使用,为了简单起见,我将其删除

    a_widget=pn.widgets.Select(name='a',options=[1,2,3,4])
    widget\u box=pn.WidgetBox(一个小部件,align='center')
    @pn.depends(a=a_widget.param.value)
    def get_积分(a):
    图像=[]
    如果a==3:
    images.append(hv.Points(np.random.rand(10,10),label='None'))
    其他:
    对于范围(1,3)内的x:
    images.append(hv.Points(np.random.rand(10,10),label=str(x)))
    返回高压叠加(图像)
    点数=hv.DynamicMap(获取点数)
    pn.行(窗口小部件,点)
    
    中描述的如何使用NdoOverlay的方法与您的方法不同,这可能是观察到问题的原因之一


    无论如何,为了缩小代码的哪一部分对观察到的问题负责,我删除了所有不需要复制它的代码

    为了清楚起见,我重命名了
    a
    的值,并且还确保提供了
    a
    的起始值

    测试代码时发现,
    if
    -
    else
    -语句既不重要,所以我也删除了它

    为了确保变量的行为符合预期,我添加了一些
    print
    -语句

    这给出了以下最小可复制示例:

    a_widget=pn.widgets.Select(name='a',value='Test',options='Test','Test1','Test2']
    @pn.depends(a=a_widget.param.value)
    def get_积分(a):
    dict_uu={}
    dict_uu[str(a)]=高压点(np.random.rand(10,10))
    打印(dict)
    叠加=hv.N叠加(dict)
    打印(套印)
    返回覆盖
    点数=hv.DynamicMap(获取点数)
    #在这里使用服务器方法查看
    #打印报表
    app=pn.Row(一个小部件,点)
    app.app()
    
    运行此代码并在选择小部件中选择不同的选项时,一旦选择了选项之一
    Test1
    Test3
    ,选项
    Test
    就不会更新

    当我们像这样更改第一行中的默认值时

    a_widget=pn.widgets.Select(name='a',value='Test2',options='Test','Test1','Test2']
    
    现在,
    Test2
    没有正确更新

    因此,这似乎是一个使用
    NdOverlay
    DynamicMap
    问题。
    因此,我建议您将此问题报告给开发人员(如果尚未报告),或者等待新版本,或者使用不同的方法(如上图所示)。

    Hi Martin,最好在此处发布指向您的So问题的链接:这样HoloView的开发人员就可以帮您解决此问题(以及其他问题)。谢谢你的提示。我加入了会议室并请求帮助:)
    b_widget
    被使用…(?)即使如此,我的示例与holoviews.org上的示例非常相似,我在问题中链接到了该示例。@Martin Rindarøy:我更新了我的答案。它现在包含一个基于代码和链接示例的零件。
    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)