Scaling of 2 NdOverlay plots not independent + Multiple activation from @pn.depends

This is my simplified code:

low1 = [1, 2, 3]
low2 = [3, 2, 1]
high = [1000, 2000, 3000]
lowCurve1 = hv.Curve(low1)
lowCurve2 = hv.Curve(low2)
lowCurves = dict(one=lowCurve1, two=lowCurve2)
highCurve = hv.Curve(high)
highCurves = dict(one=highCurve)

class LowHigh(param.Parameterized):
    lhSelect = param.Selector(default='high', objects=['low','high'])    

lh = LowHigh()

def makeLHPlot(someCurves):
    allGraph = hv.NdOverlay(someCurves) 
    return allGraph
  
@pn.depends(LowHigh.param.lhSelect, watch=True)
def updateLHGraph(lhSelect):
    print('updateLHGraph:', lhSelect)
    if lhSelect == 'high':
        return (makeLHPlot(highCurves) + makeLHPlot(highCurves)).cols(1)
    else:
        return (makeLHPlot(lowCurves) + makeLHPlot(highCurves)).cols(1)
   
pn.Column(pn.pane.Markdown('# Panel plot simple example'),
    LowHigh.param.lhSelect,
    updateLHGraph
)

I have 2 questions:
a. When I click on the selector, the updateLHGraph function is called twice. Why? How to avoid this?
b. When one low and on high graph are displayed, the y-axis on the low takes its values from high (i.e., goes from 0 to 3000+ and not from 0 to 3+). How can I get this to optimize itself for the low values? I tried setting axiswise=False in the Curve opts, but to no avail.

a. When I click on the selector, the updateLHGraph function is called twice. Why? How to avoid this?

The depends decorator expresses the dependencies so that Panel can call the function whenever that parameter changes. Adding watch=True ensures the callback is called independently of Panel and therefore usually only makes sense when you have a callback that has some side-effects. By setting watch=True and passing the callback to Panel you are telling it to call it twice. So simply remove watch=True.

When one low and on high graph are displayed, the y-axis on the low takes its values from high (i.e., goes from 0 to 3000+ and not from 0 to 3+). How can I get this to optimize itself for the low values? I tried setting axiswise=False in the Curve opts, but to no avail.

I think you want axiswise=True.

Thank you for the reply.

The example here is a stylized version of my actual code, which looks more like FileSelector modify path via ObjectSelector - dropdown list does not change.

If I leave out the watch=True, then my Selector is not called and my wildcard is again not updated.