Keep zoom while changing variables and allow reset

I’m not sure if it’s the behavior you are looking for but with a hook you can acchieve this:
I havent you used your last piece of code but the one before

import numpy as np
import pandas as pd
import sys

import holoviews as hv
from holoviews.operation.datashader import datashade
from holoviews.streams import RangeX
import panel as pn
import panel.widgets as pnw
from functools import partial
hv.extension('bokeh')
pn.extension()


    
#Generating random data
time_min = 30#minutes

fs = 180
num_samples = time_min*60*fs
index = np.arange(0,num_samples)
time = index/180 #seconds

#Generating data
sine = np.sin(time)
linear = time
square = np.square(time)

#Creating data frame
data = {"time":time,"sine":sine,"linear":linear,"square":square}
df = pd.DataFrame(data=data)
#Initializing variables


left_variable = pnw.Select(name = "variable select", options=["square","linear","sine"])

def plot(variable):
    return hv.Curve((df['time'].values, df[variable].values), vdims="W")

#creating timeplot
@pn.depends(variable = left_variable.param.value)
def time_plot(variable):
    return plot(variable)

def reset_y_hook(plot, elem):
    bkplot = plot.handles['plot']
    ydata = elem.dataset.data[elem.dataset.vdims[0].name]
    y_range = ydata.min(), ydata.max()
    old_y_range_reset = bkplot.y_range.reset_start, bkplot.y_range.reset_end  
    if old_y_range_reset != y_range:
        bkplot.y_range.start, bkplot.y_range.end = y_range
        bkplot.y_range.reset_start, bkplot.y_range.reset_end = y_range

dmap = datashade(hv.DynamicMap(time_plot)).opts(width=700, hooks=[reset_y_hook])
#Creating dashboard
dashboard = pn.Column(left_variable,dmap)
dashboard

1 Like