MarcSkovMadsen commited on
Commit
19c6661
·
1 Parent(s): d0a54a3

Upload 2 files

Browse files
Files changed (2) hide show
  1. index.html +372 -0
  2. index.js +272 -0
index.html ADDED
@@ -0,0 +1,372 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="en" >
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <title>The easiest way to create a dashboard</title>
6
+ <link rel="apple-touch-icon" sizes="180x180" href="https://cdn.holoviz.org/panel/1.3.6/dist/images/apple-touch-icon.png">
7
+ <link rel="icon" href="https://cdn.holoviz.org/panel/1.3.6/dist/images/favicon.ico" type=""><meta name="name" content="The easiest way to create a dashboard"> <style>
8
+ html, body {
9
+ display: flow-root;
10
+ box-sizing: border-box;
11
+ height: 100%;
12
+ margin: 0;
13
+ padding: 0;
14
+ }
15
+ </style>
16
+ <link rel="stylesheet" href="https://cdn.holoviz.org/panel/1.3.6/dist/bundled/datatabulator/[email protected]/dist/css/tabulator_fast.min.css" type="text/css" />
17
+
18
+ <style type="text/css">
19
+ :host(.pn-loading),
20
+ .pn-loading {
21
+ overflow: hidden;
22
+ }
23
+
24
+ :host(.pn-loading):before,
25
+ .pn-loading:before {
26
+ position: absolute;
27
+ height: 100%;
28
+ width: 100%;
29
+ content: '';
30
+ z-index: 1000;
31
+ background-color: rgb(255, 255, 255, 0.5);
32
+ border-color: lightgray;
33
+ background-repeat: no-repeat;
34
+ background-position: center;
35
+ background-size: auto 50%;
36
+ border-width: 1px;
37
+ cursor: progress;
38
+ }
39
+
40
+ :host(.pn-loading) .pn-loading-msg,
41
+ .pn-loading .pn-loading-msg {
42
+ position: absolute;
43
+ top: 72%;
44
+ font-size: 2em;
45
+ color: black;
46
+ width: 100%;
47
+ text-align: center;
48
+ }
49
+
50
+
51
+ :host(.pn-loading.pn-arc):before, .pn-loading.pn-arc:before {
52
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46IGF1dG87IGJhY2tncm91bmQ6IG5vbmU7IGRpc3BsYXk6IGJsb2NrOyBzaGFwZS1yZW5kZXJpbmc6IGF1dG87IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYzNjM2MzIiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij4gICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIj48L2FuaW1hdGVUcmFuc2Zvcm0+ICA8L2NpcmNsZT48L3N2Zz4=");
53
+ background-size: auto calc(min(50%, 400px));
54
+ }
55
+ </style><script type="text/javascript" src="https://cdn.holoviz.org/panel/1.3.6/dist/bundled/datatabulator/[email protected]/dist/js/tabulator.min.js"></script>
56
+ <script type="text/javascript" src="https://cdn.holoviz.org/panel/1.3.6/dist/bundled/datatabulator/luxon/build/global/luxon.min.js"></script>
57
+ <script type="text/javascript" src="https://cdn.bokeh.org/bokeh/release/bokeh-3.3.2.min.js"></script>
58
+ <script type="text/javascript" src="https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.3.2.min.js"></script>
59
+ <script type="text/javascript" src="https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.3.2.min.js"></script>
60
+ <script type="text/javascript" src="https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.3.2.min.js"></script>
61
+ <script type="text/javascript" src="https://cdn.holoviz.org/panel/1.3.6/dist/panel.min.js"></script>
62
+
63
+ <script type="text/javascript">
64
+ Bokeh.set_log_level("info");
65
+ </script><!-- Template CSS -->
66
+ <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans">
67
+ <link rel="stylesheet" href="https://cdn.holoviz.org/panel/1.3.6/dist/bundled/theme/default.css">
68
+ <link rel="stylesheet" href="https://cdn.holoviz.org/panel/1.3.6/dist/bundled/fastbasetemplate/fast.css">
69
+ <link rel="stylesheet" href="https://cdn.holoviz.org/panel/1.3.6/dist/bundled/fastlisttemplate/fast_list_template.css">
70
+ <style type="text/css">
71
+
72
+ :host(.pn-loading.pn-arc):before, .pn-loading.pn-arc:before {
73
+ background-image: url("data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46IGF1dG87IGJhY2tncm91bmQ6IG5vbmU7IGRpc3BsYXk6IGJsb2NrOyBzaGFwZS1yZW5kZXJpbmc6IGF1dG87IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYzNjM2MzIiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij4gICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIj48L2FuaW1hdGVUcmFuc2Zvcm0+ICA8L2NpcmNsZT48L3N2Zz4=");
74
+ background-size: auto calc(min(50%, 400px));
75
+ }
76
+ </style>
77
+ <link rel="stylesheet" type="text/css" href="//fonts.googleapis.com/css?family=Open+Sans" />
78
+
79
+ <style>
80
+ :root {
81
+ --background-color: #ffffff;
82
+ --body-font: Open Sans, sans-serif;
83
+ --corner-radius: 3;
84
+ --header-background: #88d8b0;
85
+ --header-color: #ffffff;
86
+ --sidebar-width: 330px;
87
+ }
88
+ body {
89
+ color: #2B2B2B;
90
+ background-color: var(--background-color);
91
+ font-family: var(--body-font);
92
+ }
93
+ #header a {
94
+ color: currentColor;
95
+ }
96
+ #header-design-provider {
97
+ --neutral-fill-hover: var(--header-background);
98
+ --neutral-fill-rest: var(--header-background);
99
+ --neutral-foreground-rest: var(--header-color);
100
+ background: var(--header-background);
101
+ color: var(--header-color);
102
+ }
103
+ #sidebar {
104
+ min-width: var(--sidebar-width);
105
+ max-width: var(--sidebar-width);
106
+ }
107
+ </style>
108
+
109
+ <!-- Template JS -->
110
+ <script src="https://cdn.holoviz.org/panel/1.3.6/dist/bundled/fastbasetemplate/fast_template.js"></script>
111
+ <script src="https://cdn.holoviz.org/panel/1.3.6/dist/bundled/@microsoft/[email protected]/dist/fast-components.js" type="module"></script>
112
+ <script src="https://cdn.holoviz.org/panel/1.3.6/dist/bundled/fast/js/fast_design.js" type="module"></script>
113
+
114
+ <!-- Fast Script -->
115
+ <script type="text/javascript">
116
+ document.addEventListener('DOMContentLoaded', (event) => {
117
+ const header_design = new window.fastDesignProvider("#header-design-provider");
118
+ const body_design = window.bodyDesign = new window.fastDesignProvider("#body-design-provider");
119
+ body_design.setLuminance(1.0);
120
+ body_design.setAccentColor("#88d8b0")
121
+ body_design.setNeutralColor("#000000");
122
+ header_design.setLuminance(1.0);
123
+ header_design.setAccentColor("#ffffff");
124
+ header_design.setNeutralColor("#ffffff");
125
+ });
126
+ </script>
127
+ </head>
128
+ <body class="pn-loading pn-arc">
129
+ <fast-design-system-provider id="body-design-provider" use-defaults>
130
+ <div id="container">
131
+ <fast-design-system-provider id="header-design-provider">
132
+ <nav id="header" class="shadow" >
133
+ <span onclick="closeNav()" id="sidebar-button">
134
+ <div class="pn-bar"></div>
135
+ <div class="pn-bar"></div>
136
+ <div class="pn-bar"></div>
137
+ </span>
138
+ <fast-tooltip anchor="sidebar-button" position="right">
139
+ Toggle the Sidebar
140
+ </fast-tooltip>
141
+ <div class="app-header">
142
+ <a class="title" href="" >The easiest way to create a dashboard</a>
143
+ </div>
144
+ <div id="header-items">
145
+ </div>
146
+ <div class="pn-toggle-theme">
147
+ <fast-switch id="theme-switch" style="float: right;" onChange="toggleLightDarkTheme('default')" checked>
148
+ <span slot="checked-message">
149
+ <svg class="theme-toggle-icon" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 25 25"><path d="M0 0h24v24H0z" fill="none"/><path d="M6.76 4.84l-1.8-1.79-1.41 1.41 1.79 1.79 1.42-1.41zM4 10.5H1v2h3v-2zm9-9.95h-2V3.5h2V.55zm7.45 3.91l-1.41-1.41-1.79 1.79 1.41 1.41 1.79-1.79zm-3.21 13.7l1.79 1.8 1.41-1.41-1.8-1.79-1.4 1.4zM20 10.5v2h3v-2h-3zm-8-5c-3.31 0-6 2.69-6 6s2.69 6 6 6 6-2.69 6-6-2.69-6-6-6zm-1 16.95h2V19.5h-2v2.95zm-7.45-3.91l1.41 1.41 1.79-1.8-1.41-1.41-1.79 1.8z"/></svg>
150
+ </span>
151
+ <span slot="unchecked-message">
152
+ <svg class="theme-toggle-icon" fill="currentColor" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 25 25"><path d="M0 0h24v24H0z" fill="none"/><path d="M10 2c-1.82 0-3.53.5-5 1.35C7.99 5.08 10 8.3 10 12s-2.01 6.92-5 8.65C6.47 21.5 8.18 22 10 22c5.52 0 10-4.48 10-10S15.52 2 10 2z"/></svg>
153
+ </span>
154
+ </fast-switch>
155
+ <fast-tooltip anchor="theme-switch" position="bottom">
156
+ Toggle the Theme
157
+ </fast-tooltip>
158
+ </div>
159
+ <div class="pn-busy-container" id="busy-container">
160
+ <div id="c782d72a-6832-412c-a60a-46aab1ba2d66" data-root-id="p1016" style="display: contents;"></div>
161
+ </div>
162
+ <fast-tooltip anchor="busy-container" position="left">
163
+ Busy Indicator
164
+ </fast-tooltip>
165
+ </nav>
166
+ </fast-design-system-provider>
167
+
168
+ <div class="row" id="content">
169
+ <div class="sidenav " id="sidebar">
170
+ <ul class="nav flex-column">
171
+ <div id="e33e4285-845f-4da7-ae9c-95060ffe746f" data-root-id="p1136" style="display: contents;"></div>
172
+ <div id="df32b787-9286-4976-abd2-43562e85a7f0" data-root-id="p1139" style="display: contents;"></div>
173
+ <div id="f41bb664-73df-4a71-9695-af32d1374a97" data-root-id="p1142" style="display: contents;"></div>
174
+ <div id="ce806b22-555a-4ac5-b7a3-577bdf7908ed" data-root-id="p1145" style="display: contents;"></div>
175
+ <div id="e247a985-568d-4956-8ed1-12c79cf78c54" data-root-id="p1148" style="display: contents;"></div>
176
+ </ul>
177
+ </div>
178
+
179
+ <div class="main" id="main">
180
+ <div class="card-margin stretch_width">
181
+ <fast-card class="pn-wrapper">
182
+ <span class="fullscreen-button" onclick="toggleFullScreen(this)">
183
+ <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 18 18">
184
+ <path d="M4.5 11H3v4h4v-1.5H4.5V11zM3 7h1.5V4.5H7V3H3v4zm10.5 6.5H11V15h4v-4h-1.5v2.5zM11 3v1.5h2.5V7H15V3h-4z"/>
185
+ </svg>
186
+ </span>
187
+ <div id="f4222dbd-b9d5-4c01-9558-2834903307a1" data-root-id="p1017" style="display: contents;"></div>
188
+ </fast-card>
189
+ </div>
190
+ <div class="card-margin stretch_width">
191
+ <fast-card class="pn-wrapper">
192
+ <span class="fullscreen-button" onclick="toggleFullScreen(this)">
193
+ <svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" viewBox="0 0 18 18">
194
+ <path d="M4.5 11H3v4h4v-1.5H4.5V11zM3 7h1.5V4.5H7V3H3v4zm10.5 6.5H11V15h4v-4h-1.5v2.5zM11 3v1.5h2.5V7H15V3h-4z"/>
195
+ </svg>
196
+ </span>
197
+ <div id="b7fdfc1c-8c8f-4a65-a2b9-a00b8d605ef2" data-root-id="p1134" style="display: contents;"></div>
198
+ </fast-card>
199
+ </div>
200
+ </div>
201
+ <fast-dialog id="pn-Modal" hidden>
202
+ <fast-button class="pn-modal-close" id="pn-closeModal">&times;</fast-button>
203
+ <div>
204
+ </div>
205
+ </fast-dialog>
206
+ </div>
207
+ </div>
208
+ </fast-design-system-provider>
209
+
210
+ <script type="text/javascript">
211
+
212
+ </script>
213
+
214
+ <script type="text/javascript">
215
+ function openNav() {
216
+ document.getElementById("sidebar").classList.remove("hidden");
217
+ document.getElementById("sidebar-button").onclick = closeNav;
218
+ }
219
+
220
+ function closeNav() {
221
+ document.getElementById("sidebar").classList.add("hidden");
222
+ document.getElementById("sidebar-button").onclick = openNav;
223
+ }
224
+
225
+ var modal = document.getElementById("pn-Modal");
226
+ var span = document.getElementById("pn-closeModal");
227
+
228
+ span.onclick = function() {
229
+ modal.style.display = "none";
230
+ }
231
+
232
+ window.onclick = function(event) {
233
+ if (event.target == modal) {
234
+ modal.style.display = "none";
235
+ }
236
+ }
237
+ </script>
238
+
239
+ <div id="a7e13da5-922b-4ac6-ab81-47fea6f75d1a" data-root-id="p1009" style="display: contents;"></div>
240
+ <div id="fb035690-9903-4447-8224-f83afc4152ad" data-root-id="p1012" style="display: contents;"></div>
241
+ <div id="e3b90b45-857a-40ad-93b5-1462446e862c" data-root-id="p1002" style="display: contents;"></div>
242
+ <div id="c6b8852c-6dcc-4ac5-8534-fe6a348e6fe4" data-root-id="p1013" style="display: contents;"></div>
243
+
244
+
245
+ <script type="text/javascript">
246
+ const pyodideWorker = new Worker("./index.js");
247
+ pyodideWorker.busy = false
248
+ pyodideWorker.queue = []
249
+
250
+ function send_change(jsdoc, event) {
251
+ if (event.setter_id != null && event.setter_id == 'py') {
252
+ return
253
+ } else if (pyodideWorker.busy && event.model && event.attr) {
254
+ let events = []
255
+ for (const old_event of pyodideWorker.queue) {
256
+ if (!(old_event.model === event.model && old_event.attr === event.attr)) {
257
+ events.push(old_event)
258
+ }
259
+ }
260
+ events.push(event)
261
+ pyodideWorker.queue = events
262
+ return
263
+ }
264
+ const patch = jsdoc.create_json_patch([event])
265
+ pyodideWorker.busy = true
266
+ pyodideWorker.postMessage({type: 'patch', patch: patch})
267
+ }
268
+
269
+ pyodideWorker.onmessage = async (event) => {
270
+ const msg = event.data
271
+
272
+ const body = document.getElementsByTagName('body')[0]
273
+ const loading_msgs = document.getElementsByClassName('pn-loading-msg')
274
+ if (msg.type === 'idle') {
275
+ if (pyodideWorker.queue.length) {
276
+ const patch = pyodideWorker.jsdoc.create_json_patch(pyodideWorker.queue)
277
+ pyodideWorker.busy = true
278
+ pyodideWorker.queue = []
279
+ pyodideWorker.postMessage({type: 'patch', patch: patch})
280
+ } else {
281
+ pyodideWorker.busy = false
282
+ }
283
+ } else if (msg.type === 'status') {
284
+ let loading_msg
285
+ if (loading_msgs.length) {
286
+ loading_msg = loading_msgs[0]
287
+ } else if (body.classList.contains('pn-loading')) {
288
+ loading_msg = document.createElement('div')
289
+ loading_msg.classList.add('pn-loading-msg')
290
+ body.appendChild(loading_msg)
291
+ }
292
+ if (loading_msg != null) {
293
+ loading_msg.innerHTML = msg.msg
294
+ }
295
+ } else if (msg.type === 'render') {
296
+ const docs_json = JSON.parse(msg.docs_json)
297
+ const render_items = JSON.parse(msg.render_items)
298
+ const root_ids = JSON.parse(msg.root_ids)
299
+
300
+ // Remap roots in message to element IDs
301
+ const root_els = document.querySelectorAll('[data-root-id]')
302
+ const data_roots = []
303
+ for (const el of root_els) {
304
+ el.innerHTML = ''
305
+ data_roots.push([el.getAttribute('data-root-id'), el.id])
306
+ }
307
+ data_roots.sort((a, b) => a[0]<b[0] ? -1: 1)
308
+ const roots = {}
309
+ for (let i=0; i<data_roots.length; i++) {
310
+ roots[root_ids[i]] = data_roots[i][1]
311
+ }
312
+ render_items[0]['roots'] = roots
313
+ render_items[0]['root_ids'] = root_ids
314
+
315
+ // Embed content
316
+ const [views] = await Bokeh.embed.embed_items(docs_json, render_items)
317
+
318
+ // Remove loading spinner and message
319
+ body.classList.remove("pn-loading", "arc")
320
+ for (const loading_msg of loading_msgs) {
321
+ loading_msg.remove()
322
+ }
323
+
324
+ // Setup bi-directional syncing
325
+ pyodideWorker.jsdoc = jsdoc = [...views.roots.values()][0].model.document
326
+ jsdoc.on_change(send_change.bind(null, jsdoc), false)
327
+ pyodideWorker.postMessage({'type': 'rendered'})
328
+ pyodideWorker.postMessage({'type': 'location', location: JSON.stringify(window.location)})
329
+ } else if (msg.type === 'patch') {
330
+ pyodideWorker.jsdoc.apply_json_patch(msg.patch, msg.buffers, setter_id='py')
331
+ }
332
+ };
333
+ </script>
334
+ <script type="application/json" id="p1190">
335
+ {"17f176aa-cfcb-40ad-8a03-07569517267c":{"version":"3.3.2","title":"The easiest way to create a dashboard","roots":[{"type":"object","name":"panel.models.location.Location","id":"p1002","attributes":{"name":"location","reload":false}},{"type":"object","name":"panel.models.markup.HTML","id":"p1009","attributes":{"name":"js_area","stylesheets":["\n:host(.pn-loading.pn-arc):before, .pn-loading.pn-arc:before {\n background-image: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46IGF1dG87IGJhY2tncm91bmQ6IG5vbmU7IGRpc3BsYXk6IGJsb2NrOyBzaGFwZS1yZW5kZXJpbmc6IGF1dG87IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYzNjM2MzIiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij4gICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIj48L2FuaW1hdGVUcmFuc2Zvcm0+ICA8L2NpcmNsZT48L3N2Zz4=\");\n background-size: auto calc(min(50%, 400px));\n}",{"type":"object","name":"ImportedStyleSheet","id":"p1154","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/loading.css"}},{"type":"object","name":"ImportedStyleSheet","id":"p1151","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/bundled/theme/fast.css"}}],"width":0,"height":0,"margin":0,"sizing_mode":"fixed","align":"start","disable_math":true}},{"type":"object","name":"panel.models.reactive_html.ReactiveHTML","id":"p1012","attributes":{"name":"actions","subscribed_events":{"type":"set","entries":["dom_event"]},"stylesheets":["\n:host(.pn-loading.pn-arc):before, .pn-loading.pn-arc:before {\n background-image: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46IGF1dG87IGJhY2tncm91bmQ6IG5vbmU7IGRpc3BsYXk6IGJsb2NrOyBzaGFwZS1yZW5kZXJpbmc6IGF1dG87IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYzNjM2MzIiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij4gICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIj48L2FuaW1hdGVUcmFuc2Zvcm0+ICA8L2NpcmNsZT48L3N2Zz4=\");\n background-size: auto calc(min(50%, 400px));\n}",{"type":"object","name":"ImportedStyleSheet","id":"p1155","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/loading.css"}},{"id":"p1151"}],"margin":0,"align":"start","data":{"type":"object","name":"TemplateActions1","id":"p1010","attributes":{"name":"TemplateActions01011"}},"scripts":{"type":"map","entries":[["open_modal",["document.getElementById(&amp;#x27;pn-Modal&amp;#x27;).style.display = &amp;#x27;block&amp;#x27;"]],["close_modal",["document.getElementById(&amp;#x27;pn-Modal&amp;#x27;).style.display = &amp;#x27;none&amp;#x27;"]]]}}},{"type":"object","name":"panel.models.browser.BrowserInfo","id":"p1013","attributes":{"name":"browser_info"}},{"type":"object","name":"panel.models.markup.HTML","id":"p1016","attributes":{"name":"busy_indicator","css_classes":["loader","light"],"stylesheets":[":host { --loading-spinner-size: 20px; }","\n:host(.pn-loading.pn-arc):before, .pn-loading.pn-arc:before {\n background-image: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46IGF1dG87IGJhY2tncm91bmQ6IG5vbmU7IGRpc3BsYXk6IGJsb2NrOyBzaGFwZS1yZW5kZXJpbmc6IGF1dG87IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYzNjM2MzIiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij4gICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIj48L2FuaW1hdGVUcmFuc2Zvcm0+ICA8L2NpcmNsZT48L3N2Zz4=\");\n background-size: auto calc(min(50%, 400px));\n}",{"type":"object","name":"ImportedStyleSheet","id":"p1156","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/loading.css"}},{"type":"object","name":"ImportedStyleSheet","id":"p1157","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/loadingspinner.css"}},{"id":"p1151"}],"min_width":20,"min_height":20,"margin":[5,10],"align":"start"}},{"type":"object","name":"Row","id":"p1017","attributes":{"name":"main-139890291797520","tags":["main"],"stylesheets":["\n:host(.pn-loading.pn-arc):before, .pn-loading.pn-arc:before {\n background-image: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46IGF1dG87IGJhY2tncm91bmQ6IG5vbmU7IGRpc3BsYXk6IGJsb2NrOyBzaGFwZS1yZW5kZXJpbmc6IGF1dG87IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYzNjM2MzIiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij4gICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIj48L2FuaW1hdGVUcmFuc2Zvcm0+ICA8L2NpcmNsZT48L3N2Zz4=\");\n background-size: auto calc(min(50%, 400px));\n}",{"type":"object","name":"ImportedStyleSheet","id":"p1006","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/loading.css"}},{"type":"object","name":"ImportedStyleSheet","id":"p1007","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/listpanel.css"}},{"type":"object","name":"ImportedStyleSheet","id":"p1004","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/bundled/theme/default.css"}},{"type":"object","name":"ImportedStyleSheet","id":"p1005","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/bundled/theme/native.css"}}],"margin":0,"sizing_mode":"stretch_width","align":"start","children":[{"type":"object","name":"Figure","id":"p1031","attributes":{"stylesheets":["\n:host(.pn-loading.pn-arc):before, .pn-loading.pn-arc:before {\n background-image: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46IGF1dG87IGJhY2tncm91bmQ6IG5vbmU7IGRpc3BsYXk6IGJsb2NrOyBzaGFwZS1yZW5kZXJpbmc6IGF1dG87IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYzNjM2MzIiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij4gICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIj48L2FuaW1hdGVUcmFuc2Zvcm0+ICA8L2NpcmNsZT48L3N2Zz4=\");\n background-size: auto calc(min(50%, 400px));\n}",{"type":"object","name":"ImportedStyleSheet","id":"p1158","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/loading.css"}},{"id":"p1151"}],"width":null,"height":400,"margin":[5,10],"sizing_mode":"stretch_width","align":"start","x_range":{"type":"object","name":"Range1d","id":"p1018","attributes":{"tags":[[["mpg","mpg",null]],[]],"start":19.0,"end":44.6,"reset_start":19.0,"reset_end":44.6}},"y_range":{"type":"object","name":"Range1d","id":"p1019","attributes":{"tags":[[["hp","hp",null]],{"type":"map","entries":[["invert_yaxis",false],["autorange",false]]}],"start":48.625,"end":100.375,"reset_start":48.625,"reset_end":100.375}},"x_scale":{"type":"object","name":"LinearScale","id":"p1041"},"y_scale":{"type":"object","name":"LinearScale","id":"p1042"},"title":{"type":"object","name":"Title","id":"p1034","attributes":{"text_color":"#2B2B2B","text_font":"Open Sans, sans-serif","text_font_size":"1.15em"}},"outline_line_color":"#888888","outline_line_alpha":0.5,"outline_line_width":1,"renderers":[{"type":"object","name":"GlyphRenderer","id":"p1071","attributes":{"name":"Asia","data_source":{"type":"object","name":"ColumnDataSource","id":"p1062","attributes":{"selected":{"type":"object","name":"Selection","id":"p1063","attributes":{"indices":[],"line_indices":[]}},"selection_policy":{"type":"object","name":"UnionRenderers","id":"p1064"},"data":{"type":"map","entries":[["mpg",{"type":"ndarray","array":{"type":"bytes","data":"AAAAAAAANECamZmZmRk1QAAAAAAAADdAAAAAAAAAOEAAAAAAAAA5QAAAAAAAADpAAAAAAAAAO0AAAAAAAIA7QAAAAAAAADxAAAAAAAAAPUAAAAAAAIA9QM3MzMzMzD1AAAAAAAAAP0AAAAAAAIA/QAAAAAAAAEBAmpmZmZkZQEAzMzMzMzNAQAAAAAAAgEBAmpmZmZnZQEAAAAAAAABBQM3MzMzMjEFAAAAAAAAAQkDNzMzMzAxCQJqZmZmZ2UJAAAAAAAAAQ0DNzMzMzAxDQM3MzMzMjENAzczMzMxMRkA="},"shape":[28],"dtype":"float64","order":"little"}],["hp",{"type":"ndarray","array":{"type":"bytes","data":"AAAAAAAAVkAAAAAAAMBXQAAAAAAAQFhAAAAAAADwV0AAAAAAAMBXQAAAAAAAwFJAAAAAAAAAVkAAAAAAAMBXQAAAAAAAwFJAAAAAAADAUkAAAAAAAABRQAAAAAAAgFZAAAAAAABATUAAAAAAAABRQAAAAAAAAFNAAAAAAADAUkAAAAAAAGBSQAAAAAAAgEpAAAAAAADAUkAAAAAAAIBRQAAAAAAAAE5AAAAAAADAUkAAAAAAAABOQAAAAAAAAE9AAAAAAADAUEAAAAAAAABOQAAAAAAAAE1AAAAAAADAUEA="},"shape":[28],"dtype":"float64","order":"little"}],["origin",["Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia","Asia"]]]}}},"view":{"type":"object","name":"CDSView","id":"p1072","attributes":{"filter":{"type":"object","name":"AllIndices","id":"p1073"}}},"glyph":{"type":"object","name":"Line","id":"p1068","attributes":{"tags":["apply_ranges"],"x":{"type":"field","field":"mpg"},"y":{"type":"field","field":"hp"},"line_color":"#ff6f69","line_width":6}},"selection_glyph":{"type":"object","name":"Line","id":"p1076","attributes":{"tags":["apply_ranges"],"x":{"type":"field","field":"mpg"},"y":{"type":"field","field":"hp"},"line_color":"#ff6f69","line_width":6}},"nonselection_glyph":{"type":"object","name":"Line","id":"p1069","attributes":{"tags":["apply_ranges"],"x":{"type":"field","field":"mpg"},"y":{"type":"field","field":"hp"},"line_color":"#ff6f69","line_alpha":0.1,"line_width":6}},"muted_glyph":{"type":"object","name":"Line","id":"p1070","attributes":{"tags":["apply_ranges"],"x":{"type":"field","field":"mpg"},"y":{"type":"field","field":"hp"},"line_color":"#ff6f69","line_alpha":0.2,"line_width":6}}}},{"type":"object","name":"GlyphRenderer","id":"p1086","attributes":{"name":"Europe","data_source":{"type":"object","name":"ColumnDataSource","id":"p1077","attributes":{"selected":{"type":"object","name":"Selection","id":"p1078","attributes":{"indices":[],"line_indices":[]}},"selection_policy":{"type":"object","name":"UnionRenderers","id":"p1079"},"data":{"type":"map","entries":[["mpg",{"type":"ndarray","array":{"type":"bytes","data":"AAAAAAAANEAAAAAAAAA3QAAAAAAAADhAAAAAAAAAPUBmZmZmZiZBQA=="},"shape":[5],"dtype":"float64","order":"little"}],["hp",{"type":"ndarray","array":{"type":"bytes","data":"AAAAAADAVkAAAAAAAMBXQAAAAAAAgFZAAAAAAADAVEAAAAAAAIBTQA=="},"shape":[5],"dtype":"float64","order":"little"}],["origin",["Europe","Europe","Europe","Europe","Europe"]]]}}},"view":{"type":"object","name":"CDSView","id":"p1087","attributes":{"filter":{"type":"object","name":"AllIndices","id":"p1088"}}},"glyph":{"type":"object","name":"Line","id":"p1083","attributes":{"tags":["apply_ranges"],"x":{"type":"field","field":"mpg"},"y":{"type":"field","field":"hp"},"line_color":"#ffcc5c","line_width":6}},"selection_glyph":{"type":"object","name":"Line","id":"p1090","attributes":{"tags":["apply_ranges"],"x":{"type":"field","field":"mpg"},"y":{"type":"field","field":"hp"},"line_color":"#ffcc5c","line_width":6}},"nonselection_glyph":{"type":"object","name":"Line","id":"p1084","attributes":{"tags":["apply_ranges"],"x":{"type":"field","field":"mpg"},"y":{"type":"field","field":"hp"},"line_color":"#ffcc5c","line_alpha":0.1,"line_width":6}},"muted_glyph":{"type":"object","name":"Line","id":"p1085","attributes":{"tags":["apply_ranges"],"x":{"type":"field","field":"mpg"},"y":{"type":"field","field":"hp"},"line_color":"#ffcc5c","line_alpha":0.2,"line_width":6}}}},{"type":"object","name":"GlyphRenderer","id":"p1100","attributes":{"name":"North America","data_source":{"type":"object","name":"ColumnDataSource","id":"p1091","attributes":{"selected":{"type":"object","name":"Selection","id":"p1092","attributes":{"indices":[],"line_indices":[]}},"selection_policy":{"type":"object","name":"UnionRenderers","id":"p1093"},"data":{"type":"map","entries":[["mpg",{"type":"ndarray","array":{"type":"bytes","data":"AAAAAAAAM0AAAAAAAAA0QAAAAAAAADVAAAAAAAAANkDNzMzMzEw2QAAAAAAAADdAAAAAAAAAOEAAAAAAAIA4QAAAAAAAADlAmpmZmZkZOUAAAAAAAIA5QAAAAAAAADpAZmZmZmZmOkAAAAAAAIA6QAAAAAAAADtAAAAAAAAAPEAAAAAAAAA9QGZmZmZm5j1AAAAAAAAAPkAAAAAAAIA+QAAAAAAAAD9AzczMzMwMQEAAAAAAAABBQDMzMzMzM0FAzczMzMwMQkA="},"shape":[25],"dtype":"float64","order":"little"}],["hp",{"type":"ndarray","array":{"type":"bytes","data":"AAAAAABAVUAAAAAAAIBWQAAAAAAAwFNAAAAAAADAU0AAAAAAAABWQAAAAAAAwFRAAAAAAAAAV0AAAAAAAABOQAAAAAAAwFJAAAAAAAAAVkAAAAAAAEBWQAAAAAAAAFRAAAAAAAAAVkAAAAAAAABSQAAAAAAAAFZAAAAAAACwVUAAAAAAAABKQAAAAAAAQFBAAAAAAAAAUUAAAAAAAIBPQAAAAAAAgFRAAAAAAACAUUAAAAAAAABWQAAAAAAAQFBAAAAAAACAUEA="},"shape":[25],"dtype":"float64","order":"little"}],["origin",["North America","North America","North America","North America","North America","North America","North America","North America","North America","North America","North America","North America","North America","North America","North America","North America","North America","North America","North America","North America","North America","North America","North America","North America","North America"]]]}}},"view":{"type":"object","name":"CDSView","id":"p1101","attributes":{"filter":{"type":"object","name":"AllIndices","id":"p1102"}}},"glyph":{"type":"object","name":"Line","id":"p1097","attributes":{"tags":["apply_ranges"],"x":{"type":"field","field":"mpg"},"y":{"type":"field","field":"hp"},"line_color":"#88d8b0","line_width":6}},"selection_glyph":{"type":"object","name":"Line","id":"p1104","attributes":{"tags":["apply_ranges"],"x":{"type":"field","field":"mpg"},"y":{"type":"field","field":"hp"},"line_color":"#88d8b0","line_width":6}},"nonselection_glyph":{"type":"object","name":"Line","id":"p1098","attributes":{"tags":["apply_ranges"],"x":{"type":"field","field":"mpg"},"y":{"type":"field","field":"hp"},"line_color":"#88d8b0","line_alpha":0.1,"line_width":6}},"muted_glyph":{"type":"object","name":"Line","id":"p1099","attributes":{"tags":["apply_ranges"],"x":{"type":"field","field":"mpg"},"y":{"type":"field","field":"hp"},"line_color":"#88d8b0","line_alpha":0.2,"line_width":6}}}}],"toolbar":{"type":"object","name":"Toolbar","id":"p1040","attributes":{"tools":[{"type":"object","name":"WheelZoomTool","id":"p1023","attributes":{"tags":["hv_created"],"renderers":"auto","zoom_together":"none"}},{"type":"object","name":"HoverTool","id":"p1024","attributes":{"tags":["hv_created"],"renderers":[{"id":"p1071"},{"id":"p1086"},{"id":"p1100"}],"tooltips":[["origin","@{origin}"],["mpg","@{mpg}"],["hp","@{hp}"]]}},{"type":"object","name":"SaveTool","id":"p1053"},{"type":"object","name":"PanTool","id":"p1054"},{"type":"object","name":"BoxZoomTool","id":"p1055","attributes":{"overlay":{"type":"object","name":"BoxAnnotation","id":"p1056","attributes":{"syncable":false,"level":"overlay","visible":false,"left":{"type":"number","value":"nan"},"right":{"type":"number","value":"nan"},"top":{"type":"number","value":"nan"},"bottom":{"type":"number","value":"nan"},"left_units":"canvas","right_units":"canvas","top_units":"canvas","bottom_units":"canvas","line_color":"black","line_alpha":1.0,"line_width":2,"line_dash":[4,4],"fill_color":"lightgrey","fill_alpha":0.5}}}},{"type":"object","name":"ResetTool","id":"p1061"}],"active_drag":{"id":"p1054"},"active_scroll":{"id":"p1023"}}},"left":[{"type":"object","name":"LinearAxis","id":"p1048","attributes":{"ticker":{"type":"object","name":"BasicTicker","id":"p1049","attributes":{"mantissas":[1,2,5]}},"formatter":{"type":"object","name":"BasicTickFormatter","id":"p1050"},"axis_label":"hp","axis_label_standoff":10,"axis_label_text_color":"#2B2B2B","axis_label_text_font":"Open Sans, sans-serif","axis_label_text_font_size":"1.25em","axis_label_text_font_style":"normal","major_label_policy":{"type":"object","name":"AllLabels","id":"p1051"},"major_label_text_color":"#2B2B2B","major_label_text_font":"Open Sans, sans-serif","major_label_text_font_size":"1.025em","axis_line_color":"#2B2B2B","axis_line_alpha":0.1,"major_tick_line_color":"#2B2B2B","major_tick_line_alpha":0.5,"minor_tick_line_color":"#2B2B2B","minor_tick_line_alpha":0.25}}],"right":[{"type":"object","name":"Legend","id":"p1074","attributes":{"location":[0,0],"title":"origin","border_line_color":"#888888","border_line_alpha":0.5,"background_fill_color":"#F7F7F7","background_fill_alpha":0.25,"click_policy":"mute","label_text_color":"#2B2B2B","label_text_font":"Open Sans, sans-serif","label_text_font_size":"1.025em","label_standoff":8,"glyph_width":15,"spacing":8,"items":[{"type":"object","name":"LegendItem","id":"p1075","attributes":{"label":{"type":"value","value":"Asia"},"renderers":[{"id":"p1071"}]}},{"type":"object","name":"LegendItem","id":"p1089","attributes":{"label":{"type":"value","value":"Europe"},"renderers":[{"id":"p1086"}]}},{"type":"object","name":"LegendItem","id":"p1103","attributes":{"label":{"type":"value","value":"North America"},"renderers":[{"id":"p1100"}]}}]}}],"below":[{"type":"object","name":"LinearAxis","id":"p1043","attributes":{"ticker":{"type":"object","name":"BasicTicker","id":"p1044","attributes":{"mantissas":[1,2,5]}},"formatter":{"type":"object","name":"BasicTickFormatter","id":"p1045"},"axis_label":"mpg","axis_label_standoff":10,"axis_label_text_color":"#2B2B2B","axis_label_text_font":"Open Sans, sans-serif","axis_label_text_font_size":"1.25em","axis_label_text_font_style":"normal","major_label_policy":{"type":"object","name":"AllLabels","id":"p1046"},"major_label_text_color":"#2B2B2B","major_label_text_font":"Open Sans, sans-serif","major_label_text_font_size":"1.025em","axis_line_color":"#2B2B2B","axis_line_alpha":0.1,"major_tick_line_color":"#2B2B2B","major_tick_line_alpha":0.5,"minor_tick_line_color":"#2B2B2B","minor_tick_line_alpha":0.25}}],"center":[{"type":"object","name":"Grid","id":"p1047","attributes":{"axis":{"id":"p1043"},"grid_line_color":null,"grid_line_alpha":0.25}},{"type":"object","name":"Grid","id":"p1052","attributes":{"dimension":1,"axis":{"id":"p1048"},"grid_line_color":null,"grid_line_alpha":0.25}}],"background_fill_color":"#ffffff","border_fill_color":"#F7F7F7","border_fill_alpha":0,"min_border_top":10,"min_border_bottom":10,"min_border_left":10,"min_border_right":10,"output_backend":"webgl"}}]}},{"type":"object","name":"panel.models.tabulator.DataTabulator","id":"p1134","attributes":{"name":"main-139890291538768","tags":["main"],"subscribed_events":{"type":"set","entries":["cell-click","selection-change","table-edit"]},"stylesheets":["\n:host(.pn-loading.pn-arc):before, .pn-loading.pn-arc:before {\n background-image: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46IGF1dG87IGJhY2tncm91bmQ6IG5vbmU7IGRpc3BsYXk6IGJsb2NrOyBzaGFwZS1yZW5kZXJpbmc6IGF1dG87IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYzNjM2MzIiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij4gICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIj48L2FuaW1hdGVUcmFuc2Zvcm0+ICA8L2NpcmNsZT48L3N2Zz4=\");\n background-size: auto calc(min(50%, 400px));\n}",{"type":"object","name":"ImportedStyleSheet","id":"p1160","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/loading.css"}},{"type":"object","name":"ImportedStyleSheet","id":"p1161","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/bundled/font-awesome/css/all.min.css"}},{"id":"p1151"},{"type":"object","name":"ImportedStyleSheet","id":"p1159","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/bundled/datatabulator/[email protected]/dist/css/tabulator_fast.min.css"}}],"margin":[5,10],"sizing_mode":"stretch_width","align":"start","configuration":{"type":"map","entries":[["selectable",true],["columns",[{"type":"map","entries":[["field","index"],["sorter","number"]]},{"type":"map","entries":[["field","origin"]]},{"type":"map","entries":[["field","mpg"],["sorter","number"]]},{"type":"map","entries":[["field","hp"],["sorter","number"]]}]],["dataTree",false]]},"columns":[{"type":"object","name":"TableColumn","id":"p1113","attributes":{"field":"index","title":"index","width":0,"formatter":{"type":"object","name":"NumberFormatter","id":"p1112","attributes":{"text_align":"left"}},"editor":{"type":"object","name":"CellEditor","id":"p1111"}}},{"type":"object","name":"TableColumn","id":"p1118","attributes":{"field":"origin","title":"origin","width":0,"formatter":{"type":"object","name":"StringFormatter","id":"p1117"},"editor":{"type":"object","name":"StringEditor","id":"p1116"}}},{"type":"object","name":"TableColumn","id":"p1123","attributes":{"field":"mpg","title":"mpg","width":0,"formatter":{"type":"object","name":"NumberFormatter","id":"p1122","attributes":{"text_align":"right","format":"0,0.0[00000]"}},"editor":{"type":"object","name":"NumberEditor","id":"p1121"}}},{"type":"object","name":"TableColumn","id":"p1128","attributes":{"field":"hp","title":"hp","width":0,"formatter":{"type":"object","name":"NumberFormatter","id":"p1127","attributes":{"text_align":"right","format":"0,0.0[00000]"}},"editor":{"type":"object","name":"NumberEditor","id":"p1126"}}}],"indexes":["index"],"layout":"fit_data_table","source":{"type":"object","name":"ColumnDataSource","id":"p1131","attributes":{"selected":{"type":"object","name":"Selection","id":"p1132","attributes":{"indices":[],"line_indices":[]}},"selection_policy":{"type":"object","name":"UnionRenderers","id":"p1133"},"data":{"type":"map","entries":[["index",{"type":"ndarray","array":{"type":"bytes","data":"IQAAAAAAAAAiAAAAHAAAACMAAAABAAAAJAAAACUAAAAdAAAAAgAAAA=="},"shape":[10],"dtype":"int32","order":"little"}],["origin",{"type":"ndarray","array":["North America","Asia","North America","Europe","North America","Asia","North America","North America","Europe","Asia"],"shape":[10],"dtype":"object","order":"little"}],["mpg",{"type":"ndarray","array":{"type":"bytes","data":"AAAAAAAAM0AAAAAAAAA0QAAAAAAAADRAAAAAAAAANEAAAAAAAAA1QJqZmZmZGTVAAAAAAAAANkDNzMzMzEw2QAAAAAAAADdAAAAAAAAAN0A="},"shape":[10],"dtype":"float64","order":"little"}],["hp",{"type":"ndarray","array":{"type":"bytes","data":"AAAAAABAVUAAAAAAAABWQAAAAAAAgFZAAAAAAADAVkAAAAAAAMBTQAAAAAAAwFdAAAAAAADAU0AAAAAAAABWQAAAAAAAwFdAAAAAAABAWEA="},"shape":[10],"dtype":"float64","order":"little"}]]}}},"cell_styles":{"type":"map","entries":[["id","a80f3355f63745bdb70d58ff04c43e65"],["data",{"type":"map"}]]},"pagination":"remote","page":1,"page_size":10,"max_page":6,"select_mode":true,"selectable_rows":null}},{"type":"object","name":"Slider","id":"p1136","attributes":{"name":"nav-139890338564752","tags":["nav"],"stylesheets":["\n:host(.pn-loading.pn-arc):before, .pn-loading.pn-arc:before {\n background-image: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46IGF1dG87IGJhY2tncm91bmQ6IG5vbmU7IGRpc3BsYXk6IGJsb2NrOyBzaGFwZS1yZW5kZXJpbmc6IGF1dG87IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYzNjM2MzIiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij4gICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIj48L2FuaW1hdGVUcmFuc2Zvcm0+ICA8L2NpcmNsZT48L3N2Zz4=\");\n background-size: auto calc(min(50%, 400px));\n}",{"type":"object","name":"ImportedStyleSheet","id":"p1162","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/loading.css"}},{"id":"p1151"}],"margin":[5,10],"sizing_mode":"stretch_width","align":"start","title":"Cylinders","start":4,"end":8,"value":4,"step":2}},{"type":"object","name":"panel.models.markup.HTML","id":"p1139","attributes":{"name":"nav-139890292094736","tags":["nav"],"css_classes":["markdown"],"stylesheets":["\n:host(.pn-loading.pn-arc):before, .pn-loading.pn-arc:before {\n background-image: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46IGF1dG87IGJhY2tncm91bmQ6IG5vbmU7IGRpc3BsYXk6IGJsb2NrOyBzaGFwZS1yZW5kZXJpbmc6IGF1dG87IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYzNjM2MzIiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij4gICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIj48L2FuaW1hdGVUcmFuc2Zvcm0+ICA8L2NpcmNsZT48L3N2Zz4=\");\n background-size: auto calc(min(50%, 400px));\n}",{"type":"object","name":"ImportedStyleSheet","id":"p1163","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/loading.css"}},{"type":"object","name":"ImportedStyleSheet","id":"p1164","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/markdown.css"}},{"id":"p1151"}],"margin":[5,10],"sizing_mode":"stretch_width","align":"start","text":"&amp;lt;p&amp;gt;Manufacturers&amp;lt;/p&amp;gt;\n"}},{"type":"object","name":"panel.models.widgets.CheckboxButtonGroup","id":"p1142","attributes":{"button_type":"primary","name":"nav-139890351409936","tags":["nav"],"css_classes":["outline"],"stylesheets":["\n:host(.pn-loading.pn-arc):before, .pn-loading.pn-arc:before {\n background-image: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46IGF1dG87IGJhY2tncm91bmQ6IG5vbmU7IGRpc3BsYXk6IGJsb2NrOyBzaGFwZS1yZW5kZXJpbmc6IGF1dG87IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYzNjM2MzIiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij4gICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIj48L2FuaW1hdGVUcmFuc2Zvcm0+ICA8L2NpcmNsZT48L3N2Zz4=\");\n background-size: auto calc(min(50%, 400px));\n}",{"type":"object","name":"ImportedStyleSheet","id":"p1165","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/loading.css"}},{"type":"object","name":"ImportedStyleSheet","id":"p1166","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/button.css"}},{"id":"p1151"}],"margin":[5,10],"sizing_mode":"stretch_width","align":"start","labels":["ford","chevrolet","honda","toyota","audi"],"active":[0,1,2,3,4]}},{"type":"object","name":"panel.models.markup.HTML","id":"p1145","attributes":{"name":"nav-139890291898384","tags":["nav"],"css_classes":["markdown"],"stylesheets":["\n:host(.pn-loading.pn-arc):before, .pn-loading.pn-arc:before {\n background-image: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46IGF1dG87IGJhY2tncm91bmQ6IG5vbmU7IGRpc3BsYXk6IGJsb2NrOyBzaGFwZS1yZW5kZXJpbmc6IGF1dG87IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYzNjM2MzIiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij4gICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIj48L2FuaW1hdGVUcmFuc2Zvcm0+ICA8L2NpcmNsZT48L3N2Zz4=\");\n background-size: auto calc(min(50%, 400px));\n}",{"type":"object","name":"ImportedStyleSheet","id":"p1167","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/loading.css"}},{"type":"object","name":"ImportedStyleSheet","id":"p1168","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/markdown.css"}},{"id":"p1151"}],"margin":[5,10],"sizing_mode":"stretch_width","align":"start","text":"&amp;lt;p&amp;gt;Y axis&amp;lt;/p&amp;gt;\n"}},{"type":"object","name":"panel.models.widgets.RadioButtonGroup","id":"p1148","attributes":{"button_type":"primary","name":"nav-139890293454416","tags":["nav"],"css_classes":["outline"],"stylesheets":["\n:host(.pn-loading.pn-arc):before, .pn-loading.pn-arc:before {\n background-image: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHN0eWxlPSJtYXJnaW46IGF1dG87IGJhY2tncm91bmQ6IG5vbmU7IGRpc3BsYXk6IGJsb2NrOyBzaGFwZS1yZW5kZXJpbmc6IGF1dG87IiB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQiPiAgPGNpcmNsZSBjeD0iNTAiIGN5PSI1MCIgZmlsbD0ibm9uZSIgc3Ryb2tlPSIjYzNjM2MzIiBzdHJva2Utd2lkdGg9IjEwIiByPSIzNSIgc3Ryb2tlLWRhc2hhcnJheT0iMTY0LjkzMzYxNDMxMzQ2NDE1IDU2Ljk3Nzg3MTQzNzgyMTM4Ij4gICAgPGFuaW1hdGVUcmFuc2Zvcm0gYXR0cmlidXRlTmFtZT0idHJhbnNmb3JtIiB0eXBlPSJyb3RhdGUiIHJlcGVhdENvdW50PSJpbmRlZmluaXRlIiBkdXI9IjFzIiB2YWx1ZXM9IjAgNTAgNTA7MzYwIDUwIDUwIiBrZXlUaW1lcz0iMDsxIj48L2FuaW1hdGVUcmFuc2Zvcm0+ICA8L2NpcmNsZT48L3N2Zz4=\");\n background-size: auto calc(min(50%, 400px));\n}",{"type":"object","name":"ImportedStyleSheet","id":"p1169","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/loading.css"}},{"type":"object","name":"ImportedStyleSheet","id":"p1170","attributes":{"url":"https://cdn.holoviz.org/panel/1.3.6/dist/css/button.css"}},{"id":"p1151"}],"margin":[5,10],"sizing_mode":"stretch_width","align":"start","labels":["hp","weight"],"active":0}}],"defs":[{"type":"model","name":"ReactiveHTML1"},{"type":"model","name":"FlexBox1","properties":[{"name":"align_content","kind":"Any","default":"flex-start"},{"name":"align_items","kind":"Any","default":"flex-start"},{"name":"flex_direction","kind":"Any","default":"row"},{"name":"flex_wrap","kind":"Any","default":"wrap"},{"name":"justify_content","kind":"Any","default":"flex-start"}]},{"type":"model","name":"FloatPanel1","properties":[{"name":"config","kind":"Any","default":{"type":"map"}},{"name":"contained","kind":"Any","default":true},{"name":"position","kind":"Any","default":"right-top"},{"name":"offsetx","kind":"Any","default":null},{"name":"offsety","kind":"Any","default":null},{"name":"theme","kind":"Any","default":"primary"},{"name":"status","kind":"Any","default":"normalized"}]},{"type":"model","name":"GridStack1","properties":[{"name":"mode","kind":"Any","default":"warn"},{"name":"ncols","kind":"Any","default":null},{"name":"nrows","kind":"Any","default":null},{"name":"allow_resize","kind":"Any","default":true},{"name":"allow_drag","kind":"Any","default":true},{"name":"state","kind":"Any","default":[]}]},{"type":"model","name":"drag1","properties":[{"name":"slider_width","kind":"Any","default":5},{"name":"slider_color","kind":"Any","default":"black"},{"name":"value","kind":"Any","default":50}]},{"type":"model","name":"click1","properties":[{"name":"terminal_output","kind":"Any","default":""},{"name":"debug_name","kind":"Any","default":""},{"name":"clears","kind":"Any","default":0}]},{"type":"model","name":"copy_to_clipboard1","properties":[{"name":"fill","kind":"Any","default":"none"},{"name":"value","kind":"Any","default":null}]},{"type":"model","name":"FastWrapper1","properties":[{"name":"object","kind":"Any","default":null},{"name":"style","kind":"Any","default":null}]},{"type":"model","name":"NotificationAreaBase1","properties":[{"name":"js_events","kind":"Any","default":{"type":"map"}},{"name":"position","kind":"Any","default":"bottom-right"},{"name":"_clear","kind":"Any","default":0}]},{"type":"model","name":"NotificationArea1","properties":[{"name":"js_events","kind":"Any","default":{"type":"map"}},{"name":"notifications","kind":"Any","default":[]},{"name":"position","kind":"Any","default":"bottom-right"},{"name":"_clear","kind":"Any","default":0},{"name":"types","kind":"Any","default":[{"type":"map","entries":[["type","warning"],["background","#ffc107"],["icon",{"type":"map","entries":[["className","fas fa-exclamation-triangle"],["tagName","i"],["color","white"]]}]]},{"type":"map","entries":[["type","info"],["background","#007bff"],["icon",{"type":"map","entries":[["className","fas fa-info-circle"],["tagName","i"],["color","white"]]}]]}]}]},{"type":"model","name":"Notification","properties":[{"name":"background","kind":"Any","default":null},{"name":"duration","kind":"Any","default":3000},{"name":"icon","kind":"Any","default":null},{"name":"message","kind":"Any","default":""},{"name":"notification_type","kind":"Any","default":null},{"name":"_destroyed","kind":"Any","default":false}]},{"type":"model","name":"TemplateActions1","properties":[{"name":"open_modal","kind":"Any","default":0},{"name":"close_modal","kind":"Any","default":0}]},{"type":"model","name":"BootstrapTemplateActions1","properties":[{"name":"open_modal","kind":"Any","default":0},{"name":"close_modal","kind":"Any","default":0}]},{"type":"model","name":"MaterialTemplateActions1","properties":[{"name":"open_modal","kind":"Any","default":0},{"name":"close_modal","kind":"Any","default":0}]}]}}
336
+ </script>
337
+ <script type="text/javascript">
338
+ (function() {
339
+ const fn = function() {
340
+ Bokeh.safely(function() {
341
+ (function(root) {
342
+ function embed_document(root) {
343
+ const docs_json = document.getElementById('p1190').textContent;
344
+ const render_items = [{"docid":"17f176aa-cfcb-40ad-8a03-07569517267c","roots":{"p1002":"e3b90b45-857a-40ad-93b5-1462446e862c","p1009":"a7e13da5-922b-4ac6-ab81-47fea6f75d1a","p1012":"fb035690-9903-4447-8224-f83afc4152ad","p1013":"c6b8852c-6dcc-4ac5-8534-fe6a348e6fe4","p1016":"c782d72a-6832-412c-a60a-46aab1ba2d66","p1017":"f4222dbd-b9d5-4c01-9558-2834903307a1","p1134":"b7fdfc1c-8c8f-4a65-a2b9-a00b8d605ef2","p1136":"e33e4285-845f-4da7-ae9c-95060ffe746f","p1139":"df32b787-9286-4976-abd2-43562e85a7f0","p1142":"f41bb664-73df-4a71-9695-af32d1374a97","p1145":"ce806b22-555a-4ac5-b7a3-577bdf7908ed","p1148":"e247a985-568d-4956-8ed1-12c79cf78c54"},"root_ids":["p1002","p1009","p1012","p1013","p1016","p1017","p1134","p1136","p1139","p1142","p1145","p1148"]}];
345
+ root.Bokeh.embed.embed_items(docs_json, render_items);
346
+ }
347
+ if (root.Bokeh !== undefined) {
348
+ embed_document(root);
349
+ } else {
350
+ let attempts = 0;
351
+ const timer = setInterval(function(root) {
352
+ if (root.Bokeh !== undefined) {
353
+ clearInterval(timer);
354
+ embed_document(root);
355
+ } else {
356
+ attempts++;
357
+ if (attempts > 100) {
358
+ clearInterval(timer);
359
+ console.log("Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing");
360
+ }
361
+ }
362
+ }, 10, root)
363
+ }
364
+ })(window);
365
+ });
366
+ };
367
+ if (document.readyState != "loading") fn();
368
+ else document.addEventListener("DOMContentLoaded", fn);
369
+ })();
370
+ </script>
371
+ </body>
372
+ </html>
index.js ADDED
@@ -0,0 +1,272 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ importScripts("https://cdn.jsdelivr.net/pyodide/v0.24.1/full/pyodide.js");
2
+
3
+ function sendPatch(patch, buffers, msg_id) {
4
+ self.postMessage({
5
+ type: 'patch',
6
+ patch: patch,
7
+ buffers: buffers
8
+ })
9
+ }
10
+
11
+ async function startApplication() {
12
+ console.log("Loading pyodide!");
13
+ self.postMessage({type: 'status', msg: 'Loading pyodide'})
14
+ self.pyodide = await loadPyodide();
15
+ self.pyodide.globals.set("sendPatch", sendPatch);
16
+ console.log("Loaded!");
17
+ await self.pyodide.loadPackage("micropip");
18
+ const env_spec = ['https://cdn.holoviz.org/panel/wheels/bokeh-3.3.2-py3-none-any.whl', 'https://cdn.holoviz.org/panel/1.3.6/dist/wheels/panel-1.3.6-py3-none-any.whl', 'pyodide-http==0.2.1', 'holoviews', 'hvplot', 'param', 'pandas']
19
+ for (const pkg of env_spec) {
20
+ let pkg_name;
21
+ if (pkg.endsWith('.whl')) {
22
+ pkg_name = pkg.split('/').slice(-1)[0].split('-')[0]
23
+ } else {
24
+ pkg_name = pkg
25
+ }
26
+ self.postMessage({type: 'status', msg: `Installing ${pkg_name}`})
27
+ try {
28
+ await self.pyodide.runPythonAsync(`
29
+ import micropip
30
+ await micropip.install('${pkg}');
31
+ `);
32
+ } catch(e) {
33
+ console.log(e)
34
+ self.postMessage({
35
+ type: 'status',
36
+ msg: `Error while installing ${pkg_name}`
37
+ });
38
+ }
39
+ }
40
+ console.log("Packages loaded!");
41
+ self.postMessage({type: 'status', msg: 'Executing code'})
42
+ const code = `
43
+
44
+ import asyncio
45
+
46
+ from panel.io.pyodide import init_doc, write_doc
47
+
48
+ init_doc()
49
+
50
+ #!/usr/bin/env python
51
+ # coding: utf-8
52
+
53
+ # # The Easiest Way to Create an Interactive Dashboard in Python
54
+ #
55
+ # This notebook is an updated version of the original notebook supporting the blog post
56
+ #
57
+ # **[The Easiest Way to Create an Interactive Dashboard in Python](https://towardsdatascience.com/the-easiest-way-to-create-an-interactive-dashboard-in-python-77440f2511d1)**. Turn Pandas pipelines into a
58
+ # dashboard using [\`param.rx\`](https://param.holoviz.org/user_guide/Reactive_Expressions.html) and [panel.ReactiveExpr](https://panel.holoviz.org/reference/panes/ReactiveExpr.html).
59
+ #
60
+ # by *Sophia Yang* and *Marc Skov Madsen*.
61
+ #
62
+ # ![Data App](https://github.com/sophiamyang/hvplot_interactive/blob/main/assets/easy-dataframe-dashboards.gif?raw=true)
63
+
64
+ # ## Import and configure packages
65
+ #
66
+ # Please note that in **Colab** you will need to \`!pip install panel hvplot\`. In VS Code notebooks you will need to install \`!pip install panel hvplot jupyter_bokeh\`.
67
+
68
+ # In[ ]:
69
+
70
+
71
+ # !pip install panel==1.3.6 hvplot==0.9.1 # colab
72
+ # !pip install panel==1.3.6 hvplot==0.9.1 jupyter_bokeh==3.0.7 # vscode
73
+
74
+
75
+ # In[ ]:
76
+
77
+
78
+ import param
79
+ import panel as pn
80
+
81
+ pn.extension('tabulator', sizing_mode="stretch_width")
82
+
83
+
84
+ # In[ ]:
85
+
86
+
87
+ import hvplot.pandas
88
+ import holoviews as hv
89
+
90
+ hv.extension('bokeh')
91
+
92
+
93
+ # ## Define Color Palette
94
+
95
+ # In[ ]:
96
+
97
+
98
+ PALETTE = ["#ff6f69", "#ffcc5c", "#88d8b0", ]
99
+ pn.Row(
100
+ pn.layout.HSpacer(height=50, styles={"background": PALETTE[0]}),
101
+ pn.layout.HSpacer(height=50, styles={"background": PALETTE[1]}),
102
+ pn.layout.HSpacer(height=50, styles={"background": PALETTE[2]}),
103
+ )
104
+
105
+
106
+ # ## Load Data
107
+
108
+ # In[ ]:
109
+
110
+
111
+ from bokeh.sampledata.autompg import autompg_clean as df
112
+ df.head(3)
113
+
114
+
115
+ # ## Define DataFrame Pipeline
116
+
117
+ # In[ ]:
118
+
119
+
120
+ def get_data(df, cylinders=4, mfr=['ford','chevrolet'], yaxis="hp"):
121
+ return (
122
+ df[
123
+ (df.cyl == cylinders) &
124
+ (df.mfr.isin(mfr))
125
+ ]
126
+ .groupby(['origin', 'mpg'])[yaxis].mean()
127
+ .to_frame()
128
+ .reset_index()
129
+ .sort_values(by='mpg')
130
+ )
131
+
132
+ get_data(df).head(3)
133
+
134
+
135
+ # ## Make DataFrame Pipeline Interactive
136
+
137
+ # Define [Panel widgets](https://panel.holoviz.org/reference/index.html#widgets)
138
+
139
+ # In[ ]:
140
+
141
+
142
+ cylinders = pn.widgets.IntSlider(name='Cylinders', start=4, end=8, step=2)
143
+ mfr = pn.widgets.ToggleGroup(
144
+ name='MFR',
145
+ options=['ford', 'chevrolet', 'honda', 'toyota', 'audi'],
146
+ value=['ford', 'chevrolet', 'honda', 'toyota', 'audi'],
147
+ button_type='primary', button_style="outline")
148
+ yaxis = pn.widgets.RadioButtonGroup(
149
+ name='Y axis',
150
+ options=['hp', 'weight'],
151
+ button_type='primary', button_style="outline"
152
+ )
153
+
154
+
155
+ # Combine pipeline and widgets
156
+
157
+ # In[ ]:
158
+
159
+
160
+ ipipeline=param.rx(get_data)(df, cylinders, mfr, yaxis)
161
+
162
+ ipipeline.head()
163
+
164
+
165
+ # ## Pipe to Tabulator
166
+
167
+ # In[ ]:
168
+
169
+
170
+ itable = pn.widgets.Tabulator(ipipeline, pagination='remote', page_size=10)
171
+ itable
172
+
173
+
174
+ # Check out the [Tabulator Reference Guide](https://panel.holoviz.org/reference/widgets/Tabulator.html) for more inspiration.
175
+
176
+ # ## Pipe to hvPlot and HoloViews
177
+
178
+ # First we will create the interactive plot with [hvPlot](https://hvplot.holoviz.org/).
179
+
180
+ # In[ ]:
181
+
182
+
183
+ ihvplot = ipipeline.hvplot(x='mpg', y=yaxis, by='origin', color=PALETTE, line_width=6, height=400, responsive=True)
184
+ ihvplot
185
+
186
+
187
+ # The we will put it in a HoloViews pane
188
+
189
+ # In[ ]:
190
+
191
+
192
+ iplot = pn.pane.HoloViews(ihvplot)
193
+ iplot
194
+
195
+
196
+ # Check out the [HoloViews Reference Guide](https://panel.holoviz.org/reference/panes/HoloViews.html) for more inspiration
197
+
198
+ # ## Layout using Template
199
+ #
200
+ # Here we use the [FastListTemplate](https://panel.holoviz.org/reference/templates/FastListTemplate.html#templates-gallery-fastlisttemplate).
201
+
202
+ # In[ ]:
203
+
204
+
205
+ template = pn.template.FastListTemplate(
206
+ title='The easiest way to create a dashboard',
207
+ sidebar=[cylinders, 'Manufacturers', mfr, 'Y axis' , yaxis],
208
+ main=[iplot, itable],
209
+ accent_base_color="#88d8b0",
210
+ header_background="#88d8b0",
211
+ # main_layout=None, # Use this if you want a gray sidebar and white main area
212
+ )
213
+ template.servable(); # Add semicolon because templates don't render well in a notebook
214
+
215
+
216
+ # To *serve the notebook* run \`panel serve the_easiest_way_to_create_dashboard.ipynb\`.
217
+
218
+
219
+ await write_doc()
220
+ `
221
+
222
+ try {
223
+ const [docs_json, render_items, root_ids] = await self.pyodide.runPythonAsync(code)
224
+ self.postMessage({
225
+ type: 'render',
226
+ docs_json: docs_json,
227
+ render_items: render_items,
228
+ root_ids: root_ids
229
+ })
230
+ } catch(e) {
231
+ const traceback = `${e}`
232
+ const tblines = traceback.split('\n')
233
+ self.postMessage({
234
+ type: 'status',
235
+ msg: tblines[tblines.length-2]
236
+ });
237
+ throw e
238
+ }
239
+ }
240
+
241
+ self.onmessage = async (event) => {
242
+ const msg = event.data
243
+ if (msg.type === 'rendered') {
244
+ self.pyodide.runPythonAsync(`
245
+ from panel.io.state import state
246
+ from panel.io.pyodide import _link_docs_worker
247
+
248
+ _link_docs_worker(state.curdoc, sendPatch, setter='js')
249
+ `)
250
+ } else if (msg.type === 'patch') {
251
+ self.pyodide.globals.set('patch', msg.patch)
252
+ self.pyodide.runPythonAsync(`
253
+ state.curdoc.apply_json_patch(patch.to_py(), setter='js')
254
+ `)
255
+ self.postMessage({type: 'idle'})
256
+ } else if (msg.type === 'location') {
257
+ self.pyodide.globals.set('location', msg.location)
258
+ self.pyodide.runPythonAsync(`
259
+ import json
260
+ from panel.io.state import state
261
+ from panel.util import edit_readonly
262
+ if state.location:
263
+ loc_data = json.loads(location)
264
+ with edit_readonly(state.location):
265
+ state.location.param.update({
266
+ k: v for k, v in loc_data.items() if k in state.location.param
267
+ })
268
+ `)
269
+ }
270
+ }
271
+
272
+ startApplication()