1+ from bokeh .embed import server_document
2+ from bokeh .layouts import column
3+ from bokeh .models import ColumnDataSource , Slider
4+ from bokeh .plotting import figure
5+ from bokeh .sampledata .sea_surface_temperature import sea_surface_temperature
16from django .shortcuts import render
7+ import panel as pn
28from tethys_sdk .permissions import login_required
9+ from tethys_sdk .gizmos import Button
10+ from .param_model import ShapeViewer
311
4- from bokeh .plotting import figure
5- from bokeh .models import ColumnDataSource , Slider
6- from bokeh .layouts import column
7- from bokeh .sampledata .sea_surface_temperature import sea_surface_temperature
8- from bokeh .embed import server_document
912
10- import param
11- import panel as pn
12- import numpy as np
13+ @login_required ()
14+ def home (request ):
15+ script = server_document (request .build_absolute_uri ())
16+ context = {'script' : script }
17+ return render (request , 'bokeh_tutorial/home.html' , context )
1318
1419
1520def home_handler (document ):
@@ -33,80 +38,14 @@ def callback(attr, old, new):
3338
3439 document .add_root (column (slider , plot ))
3540
36-
3741@login_required ()
38- def home (request ):
42+ def shapes_with_panel (request ):
3943 script = server_document (request .build_absolute_uri ())
4044 context = {'script' : script }
41- return render (request , 'bokeh_tutorial/home.html' , context )
42-
43-
44- class Shape (param .Parameterized ):
45- radius = param .Number (default = 1 , bounds = (0 , 1 ))
46-
47- def __init__ (self , ** params ):
48- super (Shape , self ).__init__ (** params )
49- self .figure = figure (x_range = (- 1 , 1 ), y_range = (- 1 , 1 ), width = 500 , height = 500 )
50- self .renderer = self .figure .line (* self ._get_coords ())
51-
52- def _get_coords (self ):
53- return [], []
54-
55- def view (self ):
56- return self .figure
57-
58-
59- class Circle (Shape ):
60- n = param .Integer (default = 100 , precedence = - 1 )
61-
62- def __init__ (self , ** params ):
63- super (Circle , self ).__init__ (** params )
64-
65- def _get_coords (self ):
66- angles = np .linspace (0 , 2 * np .pi , self .n + 1 )
67- return (self .radius * np .sin (angles ),
68- self .radius * np .cos (angles ))
69-
70- @param .depends ('radius' , watch = True )
71- def update (self ):
72- xs , ys = self ._get_coords ()
73- self .renderer .data_source .data .update ({'x' : xs , 'y' : ys })
74-
75-
76- class NGon (Circle ):
77- n = param .Integer (default = 3 , bounds = (3 , 10 ), precedence = 1 )
78-
79- @param .depends ('radius' , 'n' , watch = True )
80- def update (self ):
81- xs , ys = self ._get_coords ()
82- self .renderer .data_source .data .update ({'x' : xs , 'y' : ys })
83-
84-
85- shapes = [NGon (name = 'NGon' ), Circle (name = 'Circle' )]
86-
87-
88- class ShapeViewer (param .Parameterized ):
89- shape = param .ObjectSelector (default = shapes [0 ], objects = shapes )
90-
91- @param .depends ('shape' )
92- def view (self ):
93- return self .shape .view ()
94-
95- @param .depends ('shape' , 'shape.radius' )
96- def title (self ):
97- return '## %s (radius=%.1f)' % (type (self .shape ).__name__ , self .shape .radius )
98-
99- def panel (self ):
100- return pn .Column (self .title , self .view )
45+ return render (request , "bokeh_tutorial/shapes.html" , context )
10146
10247
10348def shapes_handler (document ):
10449 viewer = ShapeViewer ()
10550 panel = pn .Row (viewer .param , viewer .panel ())
10651 panel .server_doc (document )
107-
108-
109- def shapes_with_panel (request ):
110- script = server_document (request .build_absolute_uri ())
111- context = {'script' : script }
112- return render (request , "bokeh_tutorial/shapes.html" , context )
0 commit comments