import param import pandas as pd import datetime as dt class BaseClass(param.Parameterized): x = param.Parameter(default=3.14, doc="X position") y = param.Parameter(default="Not editable", constant=True) string_value = param.String(default="str", doc="A string") num_int = param.Integer(50000, bounds=(-200, 100000)) unbounded_int = param.Integer(23) float_with_hard_bounds = param.Number(8.2, bounds=(7.5, 10)) float_with_soft_bounds = param.Number(0.5, bounds=(0, None), softbounds=(0,2)) unbounded_float = param.Number(30.01, precedence=0) hidden_parameter = param.Number(2.718, precedence=-1) integer_range = param.Range(default=(3, 7), bounds=(0, 10)) float_range = param.Range(default=(0, 1.57), bounds=(0, 3.145)) dictionary = param.Dict(default={"a": 2, "b": 9}) class Example(BaseClass): """An example Parameterized class""" timestamps = [] boolean = param.Boolean(True, doc="A sample Boolean parameter") color = param.Color(default='#FFFFFF') date = param.Date(dt.datetime(2017, 1, 1), bounds=(dt.datetime(2017, 1, 1), dt.datetime(2017, 2, 1))) dataframe = param.DataFrame(pd._testing.makeDataFrame().iloc[:3]) select_string = param.ObjectSelector(default="yellow", objects=["red", "yellow", "green"]) select_fn = param.ObjectSelector(default=list,objects=[list, set, dict]) int_list = param.ListSelector(default=[3, 5], objects=[1, 3, 5, 7, 9], precedence=0.5) single_file = param.FileSelector(path='../../*/*.py*', precedence=0.5) multiple_files = param.MultiFileSelector(path='../../*/*.py?', precedence=0.5) record_timestamp = param.Action(lambda x: x.timestamps.append(dt.datetime.utcnow()), doc="""Record timestamp.""", precedence=0.7) Example.num_int import panel as pn pn.extension() base = BaseClass() pn.Row(Example.param, base.param) Example.unbounded_int Example.num_int Example.int_list = [1, 7] Example.timestamps pn.Row(Example.param.float_range, Example.param.num_int) class CustomExample(param.Parameterized): """An example Parameterized class""" select_string = param.Selector(objects=["red", "yellow", "green"]) autocomplete_string = param.Selector(default='', objects=["red", "yellow", "green"], check_on_set=False) select_number = param.Selector(objects=[0, 1, 10, 100]) pn.Param(CustomExample.param, widgets={ 'select_string': pn.widgets.RadioButtonGroup, 'autocomplete_string': pn.widgets.AutocompleteInput, 'select_number': pn.widgets.DiscretePlayer} ) pn.Param(CustomExample.param, widgets={ 'select_string': {'widget_type': pn.widgets.RadioButtonGroup, 'button_type': 'success'}, 'autocomplete_string': {'widget_type': pn.widgets.AutocompleteInput, 'placeholder': 'Find a color...'}, 'select_number': pn.widgets.DiscretePlayer} ) pn.widgets.IntSlider.from_param(Example.param.unbounded_int, start=0, end=100) pn.Param(CustomExample.param, name="Custom Name") pn.Param(CustomExample.param, sort=True, name="Sort by Label Example") def sort_func(x): return len(x[1].label) pn.Param(CustomExample.param, sort=sort_func, name="Sort by Label Length Example") import numpy as np class Sine(param.Parameterized): phase = param.Number(default=0, bounds=(0, np.pi)) frequency = param.Number(default=1, bounds=(0.1, 2)) @param.depends('phase', 'frequency') def view(self): y = np.sin(np.linspace(0, np.pi * 3, 40) * self.frequency + self.phase) y = ((y - y.min()) / y.ptp()) * 20 array = np.array( [list((' ' * (int(round(d)) - 1) + '*').ljust(20)) for d in y]) return pn.pane.Str('\n'.join([''.join(r) for r in array.T]), height=380, width=500) sine = Sine(name='ASCII Sine Wave') pn.Row(sine.param, sine.view) pn.Row(pn.panel(sine.param, parameters=['phase']), sine.view) class GoogleMapViewer(param.Parameterized): continent = param.ObjectSelector(default='Asia', objects=['Africa', 'Asia', 'Europe']) country = param.ObjectSelector(default='China', objects=['China', 'Thailand', 'Japan']) _countries = {'Africa': ['Ghana', 'Togo', 'South Africa', 'Tanzania'], 'Asia' : ['China', 'Thailand', 'Japan'], 'Europe': ['Austria', 'Bulgaria', 'Greece', 'Portugal', 'Switzerland']} @param.depends('continent', watch=True) def _update_countries(self): countries = self._countries[self.continent] self.param['country'].objects = countries self.country = countries[0] @param.depends('country') def view(self): iframe = """ """.format(country=self.country) return pn.pane.HTML(iframe, height=400) viewer = GoogleMapViewer(name='Google Map Viewer') pn.Row(viewer.param, viewer.view) from bokeh.plotting import figure class Shape(param.Parameterized): radius = param.Number(default=1, bounds=(0, 1)) def __init__(self, **params): super(Shape, self).__init__(**params) self.figure = figure(x_range=(-1, 1), y_range=(-1, 1)) self.renderer = self.figure.line(*self._get_coords()) def _get_coords(self): return [], [] def view(self): return self.figure class Circle(Shape): n = param.Integer(default=100, precedence=-1) def _get_coords(self): angles = np.linspace(0, 2 * np.pi, self.n + 1) return (self.radius * np.sin(angles), self.radius * np.cos(angles)) @param.depends('radius', watch=True) def update(self): xs, ys = self._get_coords() self.renderer.data_source.data.update({'x': xs, 'y': ys}) class NGon(Circle): n = param.Integer(default=3, bounds=(3, 10), precedence=1) @param.depends('radius', 'n', watch=True) def update(self): xs, ys = self._get_coords() self.renderer.data_source.data.update({'x': xs, 'y': ys}) shapes = [NGon(), Circle()] class ShapeViewer(param.Parameterized): shape = param.ObjectSelector(default=shapes[0], objects=shapes) @param.depends('shape') def view(self): return self.shape.view() @param.depends('shape', 'shape.radius') def title(self): return '## %s (radius=%.1f)' % (type(self.shape).__name__, self.shape.radius) def panel(self): return pn.Column(self.title, self.view) viewer = ShapeViewer() pn.Row(viewer.param, viewer.panel()) viewer = ShapeViewer() expand_layout = pn.Column() pn.Row( pn.Column( pn.panel(viewer.param, expand_button=False, expand=True, expand_layout=expand_layout), "#### Subobject parameters:", expand_layout), viewer.panel()) class QueryExample(param.Parameterized): integer = param.Integer(default=None, bounds=(0, 10)) string = param.String(default='A string') pn.state.location.sync(QueryExample, {'integer': 'int', 'string': 'str'}) QueryExample.integer = 5