import panel as pn import param pn.extension() import datetime import pandas as pd import hvplot.pandas DATE_BOUNDS = (datetime.date(1900, 1, 1), datetime.datetime.now().date()) class PowerCurve(param.Parameterized): ten_sec = param.Number(default=1079) ten_sec_date = param.Date(default=datetime.date(2018, 8, 21), bounds=DATE_BOUNDS) one_min = param.Number(default=684) one_min_date = param.Date(default=datetime.date(2017, 8, 31), bounds=DATE_BOUNDS) ten_min = param.Number(default=419) ten_min_date = param.Date(default=datetime.date(2017, 9, 22), bounds=DATE_BOUNDS) twenty_min = param.Number(default=398) twenty_min_date = param.Date(default=datetime.date(2017, 9, 22), bounds=DATE_BOUNDS) one_hour = param.Number(default=319) one_hour_date = param.Date(default=datetime.date(2017, 8, 6), bounds=DATE_BOUNDS) @param.depends("ten_sec", "one_min", "ten_min", "twenty_min", "one_hour") def plot(self): data = { "duration": [10 / 60, 1, 10, 20, 60], "power": [self.ten_sec, self.one_min, self.ten_min, self.twenty_min, self.one_hour], } dataframe = pd.DataFrame(data) line_plot = dataframe.hvplot.line( x="duration", y="power", line_color="#007BFF", line_width=3, responsive=True, ) scatter_plot = dataframe.hvplot.scatter( x="duration", y="power", marker="o", size=6, color="#007BFF", responsive=True ) fig = line_plot * scatter_plot gridstyle = {"grid_line_color": "black", "grid_line_width": 0.1} fig = fig.opts( min_height=400, toolbar=None, yticks=list(range(0, 1600, 200)), ylim=(0, 1500), gridstyle=gridstyle, show_grid=True, ) return fig class Athlete(param.Parameterized): name_ = param.String(default="P.A. Nelson") birthday = param.Date(default=datetime.date(1976, 9, 17), bounds=DATE_BOUNDS) weight = param.Number(default=82, bounds=(20,300)) power_curve = param.ClassSelector(class_=PowerCurve, default=PowerCurve()) athlete = Athlete() pn.Param(athlete) pn.Param(athlete, widgets={"birthday": pn.widgets.DatePicker, "weight": pn.widgets.LiteralInput}) pn.Param( athlete, widgets={ "birthday": pn.widgets.DatePicker, "weight": pn.widgets.LiteralInput }, expand=True) pn.Param( athlete, widgets={"birthday": pn.widgets.DatePicker}, parameters=["name_", "birthday"], show_name=False, default_layout=pn.Row, width=400 ) athlete_view = pn.Param( athlete, widgets={ "birthday": pn.widgets.DatePicker, "weight": {"type": pn.widgets.LiteralInput, "width": 100} }, parameters=["name_", "birthday", "weight"], show_name=False, default_layout=pn.Row, width=600 ) athlete_view pn.Param(athlete.power_curve) def new_class(cls, **kwargs): "Creates a new class which overrides parameter defaults." return type(type(cls).__name__, (cls,), kwargs) power_curve_columns_view = pn.Param( athlete.power_curve, default_layout=new_class(pn.GridBox, ncols=2), show_name=False, widgets = { "ten_sec_date": pn.widgets.DatePicker, "one_min_date": pn.widgets.DatePicker, "ten_min_date": pn.widgets.DatePicker, "twenty_min_date": pn.widgets.DatePicker, "one_hour_date": pn.widgets.DatePicker } ) power_curve_columns_view sections = {'InputFiles': ['dirs', 'files'], 'Field': ['grps', 'varns']} def update(target, event): target.param.update(options=sections[event.new], value=sections[event.new][0]) sel = pn.widgets.Select(options=list(sections.keys())) rad = pn.widgets.RadioButtonGroup(options=sections[sel.value]) sel.link(rad, callbacks={'value': update}) pn.Column(sel, rad) power_curve_view = pn.Row( power_curve_columns_view, athlete.power_curve.plot, sizing_mode='stretch_width' ) power_curve_view pn.Column( pn.pane.Markdown("### Athlete"), athlete_view, pn.pane.Markdown("#### Power Curve"), power_curve_view, sizing_mode='stretch_width' ) class A(param.Parameterized): without_throttled_enabled = param.Range( default=(100, 250), bounds=(0, 250), ) with_throttled_enabled = param.Range( default=(100, 250), bounds=(0, 250), ) def __init__(self, **params): super().__init__(**params) widgets = { "without_throttled_enabled": pn.widgets.IntRangeSlider, "with_throttled_enabled": { "type": pn.widgets.IntRangeSlider, "throttled": True, }, } self.controls = pn.Param(self, widgets=widgets) @param.depends("controls") def calculation(self): return self.without_throttled_enabled, self.with_throttled_enabled a = A() pn.Column(a.controls, a.calculation)