j1-template 2022.4.2 → 2022.4.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/assets/themes/j1/core/js/template.min.js.map +1 -1
  3. data/assets/themes/j1/modules/vega/js/vega-lite/README.md +0 -13
  4. data/lib/j1/version.rb +1 -1
  5. data/lib/starter_web/Gemfile +1 -1
  6. data/lib/starter_web/_config.yml +1 -1
  7. data/lib/starter_web/_data/modules/defaults/nbinteract.yml +1 -1
  8. data/lib/starter_web/_data/modules/navigator_menu.yml +60 -73
  9. data/lib/starter_web/_data/modules/nbinteract.yml +291 -314
  10. data/lib/starter_web/_plugins/lunr_index.rb +1 -1
  11. data/lib/starter_web/assets/images/modules/attics/shubham-dhage-2-1920x1280.jpg +0 -0
  12. data/lib/starter_web/package.json +1 -1
  13. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_altair_interactive.html +2216 -0
  14. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_altair_non_interactive.html +1170 -0
  15. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_bokeh_01_basic_plotting.html +1479 -0
  16. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_bokeh_02_styling_and_theming.html +1524 -0
  17. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_bokeh_03_data_sources_and_transformations.html +983 -0
  18. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_bokeh_04_adding_annotations.html +1280 -0
  19. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_bokeh_05_presentation_layouts.html +660 -0
  20. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_bokeh_06_linking_and_interactions.html +1563 -0
  21. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_bokeh_07_bar_and_categorical_data_plots.html +1888 -0
  22. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_bokeh_08_graph_and_network_plots.html +689 -0
  23. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_bokeh_09_geographic_plots.html +767 -0
  24. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_circular_times_table.html +2 -1
  25. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_interactive_widgets.html +21 -0
  26. data/lib/starter_web/utilsrv/_defaults/package.json +1 -1
  27. data/lib/starter_web/utilsrv/package.json +1 -1
  28. metadata +14 -14
  29. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/nbi_docs_examples_central_limit_theorem.html +0 -290
  30. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/nbi_docs_examples_correlation.html +0 -818
  31. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/nbi_docs_examples_empirical_distributions.html +0 -351
  32. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/nbi_docs_examples_linear_regression.html +0 -106
  33. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/nbi_docs_examples_probability_distribution_plots.html +0 -228
  34. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/nbi_docs_examples_sampling_from_a_population.html +0 -518
  35. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/nbi_docs_examples_variability_of_the_sample_mean.html +0 -372
  36. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/nbi_docs_recipes_graphing.html +0 -473
  37. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/nbi_docs_recipes_interactive_questions.html +0 -242
  38. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/nbi_docs_recipes_layout.html +0 -496
  39. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/nbi_docs_tutorial_interact.html +0 -329
  40. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/nbi_docs_tutorial_monty_hall.html +0 -866
@@ -0,0 +1,689 @@
1
+ <div class="cell text_cell">
2
+ <button class="js-nbinteract-widget">
3
+ Loading widgets...
4
+ </button>
5
+ </div>
6
+
7
+
8
+
9
+ <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
10
+ <div class="text_cell_render border-box-sizing rendered_html">
11
+ <h2 id="8.-Graph-and-Network-Plots">8. Graph and Network Plots<a class="anchor-link" href="#8.-Graph-and-Network-Plots">&#182;</a></h2><p>This chapter will cover how to plot network node/link graphs in Bokeh using NetworkX. For information on creating graph renderers from a low level, see <a href="https://docs.bokeh.org/en/latest/docs/user_guide/graph.html">Visualizing Network Graphs</a></p>
12
+
13
+ </div>
14
+ </div>
15
+ </div>
16
+
17
+
18
+
19
+ <div class="
20
+ cell border-box-sizing code_cell rendered">
21
+ <div class="input">
22
+
23
+ <div class="inner_cell">
24
+ <div class="input_area">
25
+ <div class=" highlight hl-ipython3"><pre><span></span><span class="kn">from</span> <span class="nn">bokeh.io</span> <span class="kn">import</span> <span class="n">show</span><span class="p">,</span> <span class="n">output_notebook</span>
26
+ <span class="kn">from</span> <span class="nn">bokeh.plotting</span> <span class="kn">import</span> <span class="n">figure</span>
27
+ </pre></div>
28
+
29
+ </div>
30
+ </div>
31
+ </div>
32
+
33
+ </div>
34
+
35
+
36
+
37
+ <div class="nbinteract-hide_out
38
+ cell border-box-sizing code_cell rendered">
39
+ <div class="input">
40
+
41
+ <div class="inner_cell">
42
+ <div class="input_area">
43
+ <div class=" highlight hl-ipython3"><pre><span></span><span class="c1">#nbi:hide_out</span>
44
+ <span class="c1"># Make all outputs INLINE for default (why a hell this is needed !!!)</span>
45
+ <span class="n">output_notebook</span><span class="p">()</span>
46
+ </pre></div>
47
+
48
+ </div>
49
+ </div>
50
+ </div>
51
+
52
+ <div class="output_wrapper">
53
+ <div class="output">
54
+
55
+
56
+ <div class="output_area">
57
+
58
+
59
+
60
+
61
+ <div class="output_html rendered_html output_subarea ">
62
+ <div class="bk-root">
63
+ <a href="https://bokeh.org" target="_blank" class="bk-logo bk-logo-small bk-logo-notebook"></a>
64
+ <span id="1002">Loading BokehJS ...</span>
65
+ </div>
66
+
67
+ </div>
68
+
69
+ </div>
70
+
71
+ <div class="output_area">
72
+
73
+
74
+
75
+
76
+
77
+
78
+ <div id="44d8f2a3-3f3a-4627-8e19-b6e6a721da25"></div>
79
+ <div class="output_subarea output_javascript ">
80
+ <script type="text/javascript">
81
+ var element = $('#44d8f2a3-3f3a-4627-8e19-b6e6a721da25');
82
+ (function(root) {
83
+ function now() {
84
+ return new Date();
85
+ }
86
+
87
+ const force = true;
88
+
89
+ if (typeof root._bokeh_onload_callbacks === "undefined" || force === true) {
90
+ root._bokeh_onload_callbacks = [];
91
+ root._bokeh_is_loading = undefined;
92
+ }
93
+
94
+ const JS_MIME_TYPE = 'application/javascript';
95
+ const HTML_MIME_TYPE = 'text/html';
96
+ const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';
97
+ const CLASS_NAME = 'output_bokeh rendered_html';
98
+
99
+ /**
100
+ * Render data to the DOM node
101
+ */
102
+ function render(props, node) {
103
+ const script = document.createElement("script");
104
+ node.appendChild(script);
105
+ }
106
+
107
+ /**
108
+ * Handle when an output is cleared or removed
109
+ */
110
+ function handleClearOutput(event, handle) {
111
+ const cell = handle.cell;
112
+
113
+ const id = cell.output_area._bokeh_element_id;
114
+ const server_id = cell.output_area._bokeh_server_id;
115
+ // Clean up Bokeh references
116
+ if (id != null && id in Bokeh.index) {
117
+ Bokeh.index[id].model.document.clear();
118
+ delete Bokeh.index[id];
119
+ }
120
+
121
+ if (server_id !== undefined) {
122
+ // Clean up Bokeh references
123
+ const cmd_clean = "from bokeh.io.state import curstate; print(curstate().uuid_to_server['" + server_id + "'].get_sessions()[0].document.roots[0]._id)";
124
+ cell.notebook.kernel.execute(cmd_clean, {
125
+ iopub: {
126
+ output: function(msg) {
127
+ const id = msg.content.text.trim();
128
+ if (id in Bokeh.index) {
129
+ Bokeh.index[id].model.document.clear();
130
+ delete Bokeh.index[id];
131
+ }
132
+ }
133
+ }
134
+ });
135
+ // Destroy server and session
136
+ const cmd_destroy = "import bokeh.io.notebook as ion; ion.destroy_server('" + server_id + "')";
137
+ cell.notebook.kernel.execute(cmd_destroy);
138
+ }
139
+ }
140
+
141
+ /**
142
+ * Handle when a new output is added
143
+ */
144
+ function handleAddOutput(event, handle) {
145
+ const output_area = handle.output_area;
146
+ const output = handle.output;
147
+
148
+ // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only
149
+ if ((output.output_type != "display_data") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {
150
+ return
151
+ }
152
+
153
+ const toinsert = output_area.element.find("." + CLASS_NAME.split(' ')[0]);
154
+
155
+ if (output.metadata[EXEC_MIME_TYPE]["id"] !== undefined) {
156
+ toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];
157
+ // store reference to embed id on output_area
158
+ output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE]["id"];
159
+ }
160
+ if (output.metadata[EXEC_MIME_TYPE]["server_id"] !== undefined) {
161
+ const bk_div = document.createElement("div");
162
+ bk_div.innerHTML = output.data[HTML_MIME_TYPE];
163
+ const script_attrs = bk_div.children[0].attributes;
164
+ for (let i = 0; i < script_attrs.length; i++) {
165
+ toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);
166
+ toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent
167
+ }
168
+ // store reference to server id on output_area
169
+ output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE]["server_id"];
170
+ }
171
+ }
172
+
173
+ function register_renderer(events, OutputArea) {
174
+
175
+ function append_mime(data, metadata, element) {
176
+ // create a DOM node to render to
177
+ const toinsert = this.create_output_subarea(
178
+ metadata,
179
+ CLASS_NAME,
180
+ EXEC_MIME_TYPE
181
+ );
182
+ this.keyboard_manager.register_events(toinsert);
183
+ // Render to node
184
+ const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};
185
+ render(props, toinsert[toinsert.length - 1]);
186
+ element.append(toinsert);
187
+ return toinsert
188
+ }
189
+
190
+ /* Handle when an output is cleared or removed */
191
+ events.on('clear_output.CodeCell', handleClearOutput);
192
+ events.on('delete.Cell', handleClearOutput);
193
+
194
+ /* Handle when a new output is added */
195
+ events.on('output_added.OutputArea', handleAddOutput);
196
+
197
+ /**
198
+ * Register the mime type and append_mime function with output_area
199
+ */
200
+ OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {
201
+ /* Is output safe? */
202
+ safe: true,
203
+ /* Index of renderer in `output_area.display_order` */
204
+ index: 0
205
+ });
206
+ }
207
+
208
+ // register the mime type if in Jupyter Notebook environment and previously unregistered
209
+ if (root.Jupyter !== undefined) {
210
+ const events = require('base/js/events');
211
+ const OutputArea = require('notebook/js/outputarea').OutputArea;
212
+
213
+ if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {
214
+ register_renderer(events, OutputArea);
215
+ }
216
+ }
217
+ if (typeof (root._bokeh_timeout) === "undefined" || force === true) {
218
+ root._bokeh_timeout = Date.now() + 5000;
219
+ root._bokeh_failed_load = false;
220
+ }
221
+
222
+ const NB_LOAD_WARNING = {'data': {'text/html':
223
+ "<div style='background-color: #fdd'>\n"+
224
+ "<p>\n"+
225
+ "BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \n"+
226
+ "may be due to a slow or bad network connection. Possible fixes:\n"+
227
+ "</p>\n"+
228
+ "<ul>\n"+
229
+ "<li>re-rerun `output_notebook()` to attempt to load from CDN again, or</li>\n"+
230
+ "<li>use INLINE resources instead, as so:</li>\n"+
231
+ "</ul>\n"+
232
+ "<code>\n"+
233
+ "from bokeh.resources import INLINE\n"+
234
+ "output_notebook(resources=INLINE)\n"+
235
+ "</code>\n"+
236
+ "</div>"}};
237
+
238
+ function display_loaded() {
239
+ const el = document.getElementById("1002");
240
+ if (el != null) {
241
+ el.textContent = "BokehJS is loading...";
242
+ }
243
+ if (root.Bokeh !== undefined) {
244
+ if (el != null) {
245
+ el.textContent = "BokehJS " + root.Bokeh.version + " successfully loaded.";
246
+ }
247
+ } else if (Date.now() < root._bokeh_timeout) {
248
+ setTimeout(display_loaded, 100)
249
+ }
250
+ }
251
+
252
+ function run_callbacks() {
253
+ try {
254
+ root._bokeh_onload_callbacks.forEach(function(callback) {
255
+ if (callback != null)
256
+ callback();
257
+ });
258
+ } finally {
259
+ delete root._bokeh_onload_callbacks
260
+ }
261
+ console.debug("Bokeh: all callbacks have finished");
262
+ }
263
+
264
+ function load_libs(css_urls, js_urls, callback) {
265
+ if (css_urls == null) css_urls = [];
266
+ if (js_urls == null) js_urls = [];
267
+
268
+ root._bokeh_onload_callbacks.push(callback);
269
+ if (root._bokeh_is_loading > 0) {
270
+ console.debug("Bokeh: BokehJS is being loaded, scheduling callback at", now());
271
+ return null;
272
+ }
273
+ if (js_urls == null || js_urls.length === 0) {
274
+ run_callbacks();
275
+ return null;
276
+ }
277
+ console.debug("Bokeh: BokehJS not loaded, scheduling load and callback at", now());
278
+ root._bokeh_is_loading = css_urls.length + js_urls.length;
279
+
280
+ function on_load() {
281
+ root._bokeh_is_loading--;
282
+ if (root._bokeh_is_loading === 0) {
283
+ console.debug("Bokeh: all BokehJS libraries/stylesheets loaded");
284
+ run_callbacks()
285
+ }
286
+ }
287
+
288
+ function on_error(url) {
289
+ console.error("failed to load " + url);
290
+ }
291
+
292
+ for (let i = 0; i < css_urls.length; i++) {
293
+ const url = css_urls[i];
294
+ const element = document.createElement("link");
295
+ element.onload = on_load;
296
+ element.onerror = on_error.bind(null, url);
297
+ element.rel = "stylesheet";
298
+ element.type = "text/css";
299
+ element.href = url;
300
+ console.debug("Bokeh: injecting link tag for BokehJS stylesheet: ", url);
301
+ document.body.appendChild(element);
302
+ }
303
+
304
+ for (let i = 0; i < js_urls.length; i++) {
305
+ const url = js_urls[i];
306
+ const element = document.createElement('script');
307
+ element.onload = on_load;
308
+ element.onerror = on_error.bind(null, url);
309
+ element.async = false;
310
+ element.src = url;
311
+ console.debug("Bokeh: injecting script tag for BokehJS library: ", url);
312
+ document.head.appendChild(element);
313
+ }
314
+ };
315
+
316
+ function inject_raw_css(css) {
317
+ const element = document.createElement("style");
318
+ element.appendChild(document.createTextNode(css));
319
+ document.body.appendChild(element);
320
+ }
321
+
322
+ const js_urls = ["https://cdn.bokeh.org/bokeh/release/bokeh-2.4.3.min.js", "https://cdn.bokeh.org/bokeh/release/bokeh-gl-2.4.3.min.js", "https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.4.3.min.js", "https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.4.3.min.js", "https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-2.4.3.min.js"];
323
+ const css_urls = [];
324
+
325
+ const inline_js = [ function(Bokeh) {
326
+ Bokeh.set_log_level("info");
327
+ },
328
+ function(Bokeh) {
329
+ }
330
+ ];
331
+
332
+ function run_inline_js() {
333
+ if (root.Bokeh !== undefined || force === true) {
334
+ for (let i = 0; i < inline_js.length; i++) {
335
+ inline_js[i].call(root, root.Bokeh);
336
+ }
337
+ if (force === true) {
338
+ display_loaded();
339
+ }} else if (Date.now() < root._bokeh_timeout) {
340
+ setTimeout(run_inline_js, 100);
341
+ } else if (!root._bokeh_failed_load) {
342
+ console.log("Bokeh: BokehJS failed to load within specified timeout.");
343
+ root._bokeh_failed_load = true;
344
+ } else if (force !== true) {
345
+ const cell = $(document.getElementById("1002")).parents('.cell').data().cell;
346
+ cell.output_area.append_execute_result(NB_LOAD_WARNING)
347
+ }
348
+ }
349
+
350
+ if (root._bokeh_is_loading === 0) {
351
+ console.debug("Bokeh: BokehJS loaded, going straight to plotting");
352
+ run_inline_js();
353
+ } else {
354
+ load_libs(css_urls, js_urls, function() {
355
+ console.debug("Bokeh: BokehJS plotting callback run at", now());
356
+ run_inline_js();
357
+ });
358
+ }
359
+ }(window));
360
+ </script>
361
+ </div>
362
+
363
+ </div>
364
+
365
+ </div>
366
+ </div>
367
+
368
+ </div>
369
+ <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
370
+ <div class="text_cell_render border-box-sizing rendered_html">
371
+ <h3 id="Plotting-from-NetworkX">Plotting from NetworkX<a class="anchor-link" href="#Plotting-from-NetworkX">&#182;</a></h3><p>The easiest way to plot network graphs with Bokeh is to use the <code>from_networkx</code> function. This function accepts any NetworkX graph and returns a Bokeh <code>GraphRenderer</code> that can be added to a plot. The <code>GraphRenderer</code> has <code>node_renderer</code> and <code>edge_renderer</code> properties that contain the Bokeh renderers that draw the nodes and edges, respectively.</p>
372
+ <p>The example below shows a Bokeh plot of <code>nx.desargues_graph()</code>, setting some of the node and edge properties.</p>
373
+
374
+ </div>
375
+ </div>
376
+ </div>
377
+
378
+
379
+
380
+ <div class="
381
+ cell border-box-sizing code_cell rendered">
382
+ <div class="input">
383
+
384
+ <div class="inner_cell">
385
+ <div class="input_area">
386
+ <div class=" highlight hl-ipython3"><pre><span></span><span class="kn">import</span> <span class="nn">networkx</span> <span class="k">as</span> <span class="nn">nx</span>
387
+ <span class="kn">from</span> <span class="nn">bokeh.models</span> <span class="kn">import</span> <span class="n">Range1d</span><span class="p">,</span> <span class="n">Plot</span>
388
+ <span class="kn">from</span> <span class="nn">bokeh.plotting</span> <span class="kn">import</span> <span class="n">from_networkx</span>
389
+
390
+ <span class="n">G</span> <span class="o">=</span> <span class="n">nx</span><span class="o">.</span><span class="n">desargues_graph</span><span class="p">()</span>
391
+
392
+ <span class="c1"># We could use figure here but don&#39;t want all the axes and titles</span>
393
+ <span class="n">plot</span> <span class="o">=</span> <span class="n">Plot</span><span class="p">(</span><span class="n">x_range</span><span class="o">=</span><span class="n">Range1d</span><span class="p">(</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="n">y_range</span><span class="o">=</span><span class="n">Range1d</span><span class="p">(</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span>
394
+
395
+ <span class="c1"># Create a Bokeh graph from the NetworkX input using nx.spring_layout</span>
396
+ <span class="n">graph</span> <span class="o">=</span> <span class="n">from_networkx</span><span class="p">(</span><span class="n">G</span><span class="p">,</span> <span class="n">nx</span><span class="o">.</span><span class="n">spring_layout</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mf">1.8</span><span class="p">,</span> <span class="n">center</span><span class="o">=</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">))</span>
397
+ <span class="n">plot</span><span class="o">.</span><span class="n">renderers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">graph</span><span class="p">)</span>
398
+
399
+ <span class="c1"># Set some of the default node glyph (Circle) properties</span>
400
+ <span class="n">graph</span><span class="o">.</span><span class="n">node_renderer</span><span class="o">.</span><span class="n">glyph</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">size</span><span class="o">=</span><span class="mi">20</span><span class="p">,</span> <span class="n">fill_color</span><span class="o">=</span><span class="s2">&quot;orange&quot;</span><span class="p">)</span>
401
+
402
+ <span class="c1"># Set some edge properties too</span>
403
+ <span class="n">graph</span><span class="o">.</span><span class="n">edge_renderer</span><span class="o">.</span><span class="n">glyph</span><span class="o">.</span><span class="n">line_dash</span> <span class="o">=</span> <span class="p">[</span><span class="mi">2</span><span class="p">,</span><span class="mi">2</span><span class="p">]</span>
404
+
405
+ <span class="n">show</span><span class="p">(</span><span class="n">plot</span><span class="p">)</span>
406
+ </pre></div>
407
+
408
+ </div>
409
+ </div>
410
+ </div>
411
+
412
+ <div class="output_wrapper">
413
+ <div class="output">
414
+
415
+
416
+ <div class="output_area">
417
+
418
+
419
+
420
+
421
+ <div class="output_html rendered_html output_subarea ">
422
+
423
+ <div class="bk-root" id="3dc41e74-32d1-470e-a4ba-62c8a826ef98" data-root-id="1005"></div>
424
+
425
+ </div>
426
+
427
+ </div>
428
+
429
+ <div class="output_area">
430
+
431
+
432
+
433
+
434
+
435
+
436
+ <div id="ef55b253-b279-40b8-a29b-739a4b7adcf4"></div>
437
+ <div class="output_subarea output_javascript ">
438
+ <script type="text/javascript">
439
+ var element = $('#ef55b253-b279-40b8-a29b-739a4b7adcf4');
440
+ (function(root) {
441
+ function embed_document(root) {
442
+ const docs_json = {"dda4bd43-30d7-4285-952e-1e1ace0209b9":{"defs":[],"roots":{"references":[{"attributes":{"renderers":[{"id":"1008"}],"title":{"id":"1028"},"toolbar":{"id":"1029"},"x_range":{"id":"1003"},"x_scale":{"id":"1026"},"y_range":{"id":"1004"},"y_scale":{"id":"1027"}},"id":"1005","type":"Plot"},{"attributes":{"end":2,"start":-2},"id":"1004","type":"Range1d"},{"attributes":{"coordinates":null,"group":null},"id":"1028","type":"Title"},{"attributes":{},"id":"1043","type":"Selection"},{"attributes":{"fill_color":{"value":"orange"},"size":{"value":20}},"id":"1009","type":"Circle"},{"attributes":{},"id":"1026","type":"LinearScale"},{"attributes":{"data":{"index":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]},"selected":{"id":"1041"},"selection_policy":{"id":"1040"}},"id":"1010","type":"ColumnDataSource"},{"attributes":{"coordinates":null,"data_source":{"id":"1010"},"glyph":{"id":"1009"},"group":null,"hover_glyph":null,"view":{"id":"1012"}},"id":"1011","type":"GlyphRenderer"},{"attributes":{"end":2,"start":-2},"id":"1003","type":"Range1d"},{"attributes":{},"id":"1042","type":"UnionRenderers"},{"attributes":{},"id":"1029","type":"Toolbar"},{"attributes":{},"id":"1039","type":"NodesOnly"},{"attributes":{"line_dash":{"value":[2,2]}},"id":"1013","type":"MultiLine"},{"attributes":{"source":{"id":"1010"}},"id":"1012","type":"CDSView"},{"attributes":{"coordinates":null,"data_source":{"id":"1014"},"glyph":{"id":"1013"},"group":null,"hover_glyph":null,"view":{"id":"1016"}},"id":"1015","type":"GlyphRenderer"},{"attributes":{"data":{"end":[1,19,5,2,16,3,11,4,14,5,9,6,7,15,8,18,9,13,10,11,19,12,13,17,14,15,16,17,18,19],"start":[0,0,0,1,1,2,2,3,3,4,4,5,6,6,7,7,8,8,9,10,10,11,12,12,13,14,15,16,17,18]},"selected":{"id":"1043"},"selection_policy":{"id":"1042"}},"id":"1014","type":"ColumnDataSource"},{"attributes":{"source":{"id":"1014"}},"id":"1016","type":"CDSView"},{"attributes":{},"id":"1040","type":"UnionRenderers"},{"attributes":{},"id":"1041","type":"Selection"},{"attributes":{"coordinates":null,"edge_renderer":{"id":"1015"},"group":null,"inspection_policy":{"id":"1039"},"layout_provider":{"id":"1017"},"node_renderer":{"id":"1011"},"selection_policy":{"id":"1038"}},"id":"1008","type":"GraphRenderer"},{"attributes":{},"id":"1038","type":"NodesOnly"},{"attributes":{"graph_layout":{"0":[-1.1697191846420025,0.1173515414514772],"1":[-0.5057291920168522,-0.3301324932847872],"10":[0.5719975650503157,1.2631756750706118],"11":[1.313965098165436,0.7475138055892768],"12":[1.8,-0.26851044191988316],"13":[1.1664816220087437,-0.0959596247815966],"14":[0.13372947509740538,-0.3165161780939663],"15":[-0.5166063416282884,-1.3155585748399368],"16":[0.13524130085257552,-1.3686876436910196],"17":[1.2070076032178527,-1.1800792705596796],"18":[0.531189057176616,-0.7356351111910615],"19":[-0.10731944301045775,0.2842846361400993],"2":[0.19771666011850458,0.655978787503953],"3":[-0.5378765089311547,0.7138724373001639],"4":[-1.2210293189531412,1.1698194541672995],"5":[-1.7999176418742517,0.22483292849859016],"6":[-1.2970256277412264,-0.7904361743869417],"7":[-0.22598047907768307,-0.6182646310380427],"8":[0.48865747492340633,0.4088624653288193],"9":[-0.1647821187357951,1.4340884127366273]}},"id":"1017","type":"StaticLayoutProvider"},{"attributes":{},"id":"1027","type":"LinearScale"}],"root_ids":["1005"]},"title":"Bokeh Application","version":"2.4.3"}};
443
+ const render_items = [{"docid":"dda4bd43-30d7-4285-952e-1e1ace0209b9","root_ids":["1005"],"roots":{"1005":"3dc41e74-32d1-470e-a4ba-62c8a826ef98"}}];
444
+ root.Bokeh.embed.embed_items_notebook(docs_json, render_items);
445
+ }
446
+ if (root.Bokeh !== undefined) {
447
+ embed_document(root);
448
+ } else {
449
+ let attempts = 0;
450
+ const timer = setInterval(function(root) {
451
+ if (root.Bokeh !== undefined) {
452
+ clearInterval(timer);
453
+ embed_document(root);
454
+ } else {
455
+ attempts++;
456
+ if (attempts > 100) {
457
+ clearInterval(timer);
458
+ console.log("Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing");
459
+ }
460
+ }
461
+ }, 10, root)
462
+ }
463
+ })(window);
464
+ </script>
465
+ </div>
466
+
467
+ </div>
468
+
469
+ </div>
470
+ </div>
471
+
472
+ </div>
473
+ <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
474
+ <div class="text_cell_render border-box-sizing rendered_html">
475
+ <h3 id="Adding-Extra-Data-Columns.">Adding Extra Data Columns.<a class="anchor-link" href="#Adding-Extra-Data-Columns.">&#182;</a></h3><p>The <code>node_renderer</code> and <code>edge_renderer</code> properties of the graph renderer each have a <code>data_source</code> that is a standard <code>ColumnDataSource</code> that you can add new data to, e.g. to drive a hover tool, or to specify colors for the renderer. The example below demonstates both.</p>
476
+
477
+ </div>
478
+ </div>
479
+ </div>
480
+
481
+
482
+
483
+ <div class="
484
+ cell border-box-sizing code_cell rendered">
485
+ <div class="input">
486
+
487
+ <div class="inner_cell">
488
+ <div class="input_area">
489
+ <div class=" highlight hl-ipython3"><pre><span></span><span class="kn">from</span> <span class="nn">bokeh.models</span> <span class="kn">import</span> <span class="n">HoverTool</span>
490
+ <span class="kn">from</span> <span class="nn">bokeh.palettes</span> <span class="kn">import</span> <span class="n">Category20_20</span>
491
+
492
+ <span class="n">G</span> <span class="o">=</span> <span class="n">nx</span><span class="o">.</span><span class="n">desargues_graph</span><span class="p">()</span> <span class="c1"># always 20 nodes</span>
493
+
494
+ <span class="c1"># We could use figure here but don&#39;t want all the axes and titles</span>
495
+ <span class="n">plot</span> <span class="o">=</span> <span class="n">Plot</span><span class="p">(</span><span class="n">x_range</span><span class="o">=</span><span class="n">Range1d</span><span class="p">(</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="n">y_range</span><span class="o">=</span><span class="n">Range1d</span><span class="p">(</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span>
496
+
497
+ <span class="c1"># Create a Bokeh graph from the NetworkX input using nx.spring_layout</span>
498
+ <span class="n">graph</span> <span class="o">=</span> <span class="n">from_networkx</span><span class="p">(</span><span class="n">G</span><span class="p">,</span> <span class="n">nx</span><span class="o">.</span><span class="n">spring_layout</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mf">1.8</span><span class="p">,</span> <span class="n">center</span><span class="o">=</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">))</span>
499
+ <span class="n">plot</span><span class="o">.</span><span class="n">renderers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">graph</span><span class="p">)</span>
500
+
501
+ <span class="c1"># Add some new columns to the node renderer data source</span>
502
+ <span class="n">graph</span><span class="o">.</span><span class="n">node_renderer</span><span class="o">.</span><span class="n">data_source</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="s1">&#39;index&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">G</span><span class="p">)))</span>
503
+ <span class="n">graph</span><span class="o">.</span><span class="n">node_renderer</span><span class="o">.</span><span class="n">data_source</span><span class="o">.</span><span class="n">data</span><span class="p">[</span><span class="s1">&#39;colors&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="n">Category20_20</span>
504
+
505
+ <span class="n">graph</span><span class="o">.</span><span class="n">node_renderer</span><span class="o">.</span><span class="n">glyph</span><span class="o">.</span><span class="n">update</span><span class="p">(</span><span class="n">size</span><span class="o">=</span><span class="mi">20</span><span class="p">,</span> <span class="n">fill_color</span><span class="o">=</span><span class="s2">&quot;colors&quot;</span><span class="p">)</span>
506
+
507
+ <span class="n">plot</span><span class="o">.</span><span class="n">add_tools</span><span class="p">(</span><span class="n">HoverTool</span><span class="p">(</span><span class="n">tooltips</span><span class="o">=</span><span class="s2">&quot;index: @index&quot;</span><span class="p">))</span>
508
+
509
+ <span class="n">show</span><span class="p">(</span><span class="n">plot</span><span class="p">)</span>
510
+ </pre></div>
511
+
512
+ </div>
513
+ </div>
514
+ </div>
515
+
516
+ <div class="output_wrapper">
517
+ <div class="output">
518
+
519
+
520
+ <div class="output_area">
521
+
522
+
523
+
524
+
525
+ <div class="output_html rendered_html output_subarea ">
526
+
527
+ <div class="bk-root" id="9e407a9f-45bb-4eb3-909f-73567b47b0e0" data-root-id="1156"></div>
528
+
529
+ </div>
530
+
531
+ </div>
532
+
533
+ <div class="output_area">
534
+
535
+
536
+
537
+
538
+
539
+
540
+ <div id="13aea0c4-5e67-497e-a333-bfa55abdd736"></div>
541
+ <div class="output_subarea output_javascript ">
542
+ <script type="text/javascript">
543
+ var element = $('#13aea0c4-5e67-497e-a333-bfa55abdd736');
544
+ (function(root) {
545
+ function embed_document(root) {
546
+ const docs_json = {"70f4192d-91f5-4be2-805d-96bc7590ba43":{"defs":[],"roots":{"references":[{"attributes":{"renderers":[{"id":"1159"}],"title":{"id":"1203"},"toolbar":{"id":"1182"},"x_range":{"id":"1154"},"x_scale":{"id":"1201"},"y_range":{"id":"1155"},"y_scale":{"id":"1202"}},"id":"1156","type":"Plot"},{"attributes":{"coordinates":null,"group":null},"id":"1203","type":"Title"},{"attributes":{"tools":[{"id":"1181"}]},"id":"1182","type":"Toolbar"},{"attributes":{"fill_color":{"field":"colors"},"size":{"value":20}},"id":"1160","type":"Circle"},{"attributes":{"data":{"colors":["#1f77b4","#aec7e8","#ff7f0e","#ffbb78","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5","#8c564b","#c49c94","#e377c2","#f7b6d2","#7f7f7f","#c7c7c7","#bcbd22","#dbdb8d","#17becf","#9edae5"],"index":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]},"selected":{"id":"1216"},"selection_policy":{"id":"1215"}},"id":"1161","type":"ColumnDataSource"},{"attributes":{"coordinates":null,"data_source":{"id":"1161"},"glyph":{"id":"1160"},"group":null,"hover_glyph":null,"view":{"id":"1163"}},"id":"1162","type":"GlyphRenderer"},{"attributes":{},"id":"1216","type":"Selection"},{"attributes":{},"id":"1202","type":"LinearScale"},{"attributes":{},"id":"1217","type":"UnionRenderers"},{"attributes":{},"id":"1164","type":"MultiLine"},{"attributes":{},"id":"1218","type":"Selection"},{"attributes":{"end":2,"start":-2},"id":"1154","type":"Range1d"},{"attributes":{"source":{"id":"1161"}},"id":"1163","type":"CDSView"},{"attributes":{"coordinates":null,"data_source":{"id":"1165"},"glyph":{"id":"1164"},"group":null,"hover_glyph":null,"view":{"id":"1167"}},"id":"1166","type":"GlyphRenderer"},{"attributes":{"end":2,"start":-2},"id":"1155","type":"Range1d"},{"attributes":{"data":{"end":[1,19,5,2,16,3,11,4,14,5,9,6,7,15,8,18,9,13,10,11,19,12,13,17,14,15,16,17,18,19],"start":[0,0,0,1,1,2,2,3,3,4,4,5,6,6,7,7,8,8,9,10,10,11,12,12,13,14,15,16,17,18]},"selected":{"id":"1218"},"selection_policy":{"id":"1217"}},"id":"1165","type":"ColumnDataSource"},{"attributes":{},"id":"1201","type":"LinearScale"},{"attributes":{},"id":"1213","type":"NodesOnly"},{"attributes":{},"id":"1214","type":"NodesOnly"},{"attributes":{"callback":null,"tooltips":"index: @index"},"id":"1181","type":"HoverTool"},{"attributes":{},"id":"1215","type":"UnionRenderers"},{"attributes":{"graph_layout":{"0":[0.3887589353717005,-1.6463395451957297],"1":[1.3846658828275602,-0.9888706384388465],"10":[-0.3973296183215949,-1.1207122973322676],"11":[0.6918050631068496,-0.4881255395997623],"12":[0.06673400378400342,0.6367856992493871],"13":[-0.372190404725156,1.6549514681639979],"14":[0.7271639261632288,1.7891590455979385],"15":[0.3829194321748063,1.1235084976407805],"16":[0.8809036502719901,0.06648880890937106],"17":[-0.30216164550127095,-0.16880764210676003],"18":[-1.3471863197399672,-0.8450704388811822],"19":[-0.7146315969319081,-1.8],"2":[1.7420569157882306,-0.20269855379172452],"3":[1.348410997257696,0.8368982830124566],"4":[0.29447020642838123,0.1620331779290003],"5":[-0.06027364250284553,-0.6417199604835925],"6":[-0.6946893384592774,0.48328883898157654],"7":[-1.7429904289732252,0.20194290100155507],"8":[-1.3800370391698809,1.0068962141713491],"9":[-0.8963989788493182,-0.05960831882754418]}},"id":"1168","type":"StaticLayoutProvider"},{"attributes":{"source":{"id":"1165"}},"id":"1167","type":"CDSView"},{"attributes":{"coordinates":null,"edge_renderer":{"id":"1166"},"group":null,"inspection_policy":{"id":"1214"},"layout_provider":{"id":"1168"},"node_renderer":{"id":"1162"},"selection_policy":{"id":"1213"}},"id":"1159","type":"GraphRenderer"}],"root_ids":["1156"]},"title":"Bokeh Application","version":"2.4.3"}};
547
+ const render_items = [{"docid":"70f4192d-91f5-4be2-805d-96bc7590ba43","root_ids":["1156"],"roots":{"1156":"9e407a9f-45bb-4eb3-909f-73567b47b0e0"}}];
548
+ root.Bokeh.embed.embed_items_notebook(docs_json, render_items);
549
+ }
550
+ if (root.Bokeh !== undefined) {
551
+ embed_document(root);
552
+ } else {
553
+ let attempts = 0;
554
+ const timer = setInterval(function(root) {
555
+ if (root.Bokeh !== undefined) {
556
+ clearInterval(timer);
557
+ embed_document(root);
558
+ } else {
559
+ attempts++;
560
+ if (attempts > 100) {
561
+ clearInterval(timer);
562
+ console.log("Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing");
563
+ }
564
+ }
565
+ }, 10, root)
566
+ }
567
+ })(window);
568
+ </script>
569
+ </div>
570
+
571
+ </div>
572
+
573
+ </div>
574
+ </div>
575
+
576
+ </div>
577
+ <div class="cell border-box-sizing text_cell rendered"><div class="inner_cell">
578
+ <div class="text_cell_render border-box-sizing rendered_html">
579
+ <h3 id="Inspection-and-Selection-Policies">Inspection and Selection Policies<a class="anchor-link" href="#Inspection-and-Selection-Policies">&#182;</a></h3><p>Bokeh graph renderers have <code>inspection_policy</code> and <code>selection_policy</code> properties. These can be used to control how hover inspections highlight the graph, or how selection tools make selections. These properties may be set to any of the inpection policies in <code>bokeh.graphs</code>. For instance, if a user hovers over a node, you may wish to highlight all the associated edges as well. This can be accomplished by setting the inspection policy:</p>
580
+ <div class="highlight"><pre><span></span><span class="n">graph</span><span class="o">.</span><span class="n">inspection_policy</span> <span class="o">=</span> <span class="n">NodesAndLinkedEdges</span><span class="p">()</span>
581
+ </pre></div>
582
+ <p>as the example below demonstrates.</p>
583
+
584
+ </div>
585
+ </div>
586
+ </div>
587
+
588
+
589
+
590
+ <div class="
591
+ cell border-box-sizing code_cell rendered">
592
+ <div class="input">
593
+
594
+ <div class="inner_cell">
595
+ <div class="input_area">
596
+ <div class=" highlight hl-ipython3"><pre><span></span><span class="kn">from</span> <span class="nn">bokeh.models.graphs</span> <span class="kn">import</span> <span class="n">NodesAndLinkedEdges</span>
597
+ <span class="kn">from</span> <span class="nn">bokeh.models</span> <span class="kn">import</span> <span class="n">Circle</span><span class="p">,</span> <span class="n">HoverTool</span><span class="p">,</span> <span class="n">MultiLine</span>
598
+
599
+ <span class="n">G</span> <span class="o">=</span> <span class="n">nx</span><span class="o">.</span><span class="n">gnm_random_graph</span><span class="p">(</span><span class="mi">15</span><span class="p">,</span> <span class="mi">30</span><span class="p">)</span>
600
+
601
+ <span class="c1"># We could use figure here but don&#39;t want all the axes and titles</span>
602
+ <span class="n">plot</span> <span class="o">=</span> <span class="n">Plot</span><span class="p">(</span><span class="n">x_range</span><span class="o">=</span><span class="n">Range1d</span><span class="p">(</span><span class="o">-</span><span class="mi">2</span><span class="p">,</span> <span class="mi">2</span><span class="p">),</span> <span class="n">y_range</span><span class="o">=</span><span class="n">Range1d</span><span class="p">(</span><span class="o">-</span><span class="mi">2</span> <span class="p">,</span><span class="mi">2</span><span class="p">))</span>
603
+
604
+ <span class="c1"># Create a Bokeh graph from the NetworkX input using nx.spring_layout</span>
605
+ <span class="n">graph</span> <span class="o">=</span> <span class="n">from_networkx</span><span class="p">(</span><span class="n">G</span><span class="p">,</span> <span class="n">nx</span><span class="o">.</span><span class="n">spring_layout</span><span class="p">,</span> <span class="n">scale</span><span class="o">=</span><span class="mf">1.8</span><span class="p">,</span> <span class="n">center</span><span class="o">=</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">))</span>
606
+ <span class="n">plot</span><span class="o">.</span><span class="n">renderers</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">graph</span><span class="p">)</span>
607
+
608
+ <span class="c1"># Blue circles for nodes, and light grey lines for edges</span>
609
+ <span class="n">graph</span><span class="o">.</span><span class="n">node_renderer</span><span class="o">.</span><span class="n">glyph</span> <span class="o">=</span> <span class="n">Circle</span><span class="p">(</span><span class="n">size</span><span class="o">=</span><span class="mi">25</span><span class="p">,</span> <span class="n">fill_color</span><span class="o">=</span><span class="s1">&#39;#2b83ba&#39;</span><span class="p">)</span>
610
+ <span class="n">graph</span><span class="o">.</span><span class="n">edge_renderer</span><span class="o">.</span><span class="n">glyph</span> <span class="o">=</span> <span class="n">MultiLine</span><span class="p">(</span><span class="n">line_color</span><span class="o">=</span><span class="s2">&quot;#cccccc&quot;</span><span class="p">,</span> <span class="n">line_alpha</span><span class="o">=</span><span class="mf">0.8</span><span class="p">,</span> <span class="n">line_width</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
611
+
612
+ <span class="c1"># green hover for both nodes and edges</span>
613
+ <span class="n">graph</span><span class="o">.</span><span class="n">node_renderer</span><span class="o">.</span><span class="n">hover_glyph</span> <span class="o">=</span> <span class="n">Circle</span><span class="p">(</span><span class="n">size</span><span class="o">=</span><span class="mi">25</span><span class="p">,</span> <span class="n">fill_color</span><span class="o">=</span><span class="s1">&#39;#abdda4&#39;</span><span class="p">)</span>
614
+ <span class="n">graph</span><span class="o">.</span><span class="n">edge_renderer</span><span class="o">.</span><span class="n">hover_glyph</span> <span class="o">=</span> <span class="n">MultiLine</span><span class="p">(</span><span class="n">line_color</span><span class="o">=</span><span class="s1">&#39;#abdda4&#39;</span><span class="p">,</span> <span class="n">line_width</span><span class="o">=</span><span class="mi">4</span><span class="p">)</span>
615
+
616
+ <span class="c1"># When we hover over nodes, highlight adjecent edges too</span>
617
+ <span class="n">graph</span><span class="o">.</span><span class="n">inspection_policy</span> <span class="o">=</span> <span class="n">NodesAndLinkedEdges</span><span class="p">()</span>
618
+
619
+ <span class="n">plot</span><span class="o">.</span><span class="n">add_tools</span><span class="p">(</span><span class="n">HoverTool</span><span class="p">(</span><span class="n">tooltips</span><span class="o">=</span><span class="kc">None</span><span class="p">))</span>
620
+
621
+ <span class="n">show</span><span class="p">(</span><span class="n">plot</span><span class="p">)</span>
622
+ </pre></div>
623
+
624
+ </div>
625
+ </div>
626
+ </div>
627
+
628
+ <div class="output_wrapper">
629
+ <div class="output">
630
+
631
+
632
+ <div class="output_area">
633
+
634
+
635
+
636
+
637
+ <div class="output_html rendered_html output_subarea ">
638
+
639
+ <div class="bk-root" id="b16c5955-5218-48ed-a187-6639f276eb5a" data-root-id="1331"></div>
640
+
641
+ </div>
642
+
643
+ </div>
644
+
645
+ <div class="output_area">
646
+
647
+
648
+
649
+
650
+
651
+
652
+ <div id="3046513c-3029-4ec8-973e-1ec14beb7cb1"></div>
653
+ <div class="output_subarea output_javascript ">
654
+ <script type="text/javascript">
655
+ var element = $('#3046513c-3029-4ec8-973e-1ec14beb7cb1');
656
+ (function(root) {
657
+ function embed_document(root) {
658
+ const docs_json = {"5837c009-ac4b-4df6-9471-bd6b0d156b93":{"defs":[],"roots":{"references":[{"attributes":{"renderers":[{"id":"1334"}],"title":{"id":"1406"},"toolbar":{"id":"1367"},"x_range":{"id":"1329"},"x_scale":{"id":"1404"},"y_range":{"id":"1330"},"y_scale":{"id":"1405"}},"id":"1331","type":"Plot"},{"attributes":{},"id":"1405","type":"LinearScale"},{"attributes":{"data":{"index":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]},"selected":{"id":"1418"},"selection_policy":{"id":"1417"}},"id":"1336","type":"ColumnDataSource"},{"attributes":{"end":2,"start":-2},"id":"1329","type":"Range1d"},{"attributes":{"fill_color":{"value":"#abdda4"},"size":{"value":25}},"id":"1354","type":"Circle"},{"attributes":{"coordinates":null,"data_source":{"id":"1336"},"glyph":{"id":"1344"},"group":null,"hover_glyph":{"id":"1354"},"view":{"id":"1338"}},"id":"1337","type":"GlyphRenderer"},{"attributes":{"tools":[{"id":"1366"}]},"id":"1367","type":"Toolbar"},{"attributes":{"source":{"id":"1336"}},"id":"1338","type":"CDSView"},{"attributes":{"coordinates":null,"group":null},"id":"1406","type":"Title"},{"attributes":{},"id":"1364","type":"NodesAndLinkedEdges"},{"attributes":{"line_color":{"value":"#abdda4"},"line_width":{"value":4}},"id":"1359","type":"MultiLine"},{"attributes":{"coordinates":null,"data_source":{"id":"1340"},"glyph":{"id":"1349"},"group":null,"hover_glyph":{"id":"1359"},"view":{"id":"1342"}},"id":"1341","type":"GlyphRenderer"},{"attributes":{},"id":"1417","type":"UnionRenderers"},{"attributes":{},"id":"1404","type":"LinearScale"},{"attributes":{"data":{"end":[12,6,3,13,14,13,12,6,12,13,14,11,4,9,12,6,5,13,13,10,8,11,14,9,10,11,11,12,12,14],"start":[0,0,0,0,1,1,1,2,2,2,3,3,3,4,4,4,4,4,5,5,6,7,7,7,9,9,10,10,11,11]},"selected":{"id":"1420"},"selection_policy":{"id":"1419"}},"id":"1340","type":"ColumnDataSource"},{"attributes":{"line_alpha":{"value":0.8},"line_color":{"value":"#cccccc"},"line_width":{"value":2}},"id":"1349","type":"MultiLine"},{"attributes":{},"id":"1418","type":"Selection"},{"attributes":{"end":2,"start":-2},"id":"1330","type":"Range1d"},{"attributes":{"callback":null,"tooltips":null},"id":"1366","type":"HoverTool"},{"attributes":{"source":{"id":"1340"}},"id":"1342","type":"CDSView"},{"attributes":{},"id":"1420","type":"Selection"},{"attributes":{},"id":"1419","type":"UnionRenderers"},{"attributes":{"graph_layout":{"0":[-0.4833281450441862,-0.23863243391835653],"1":[0.3568648536585474,0.4296361393270891],"10":[0.5777886700411361,0.3425039218236356],"11":[0.6058554964558718,-0.22501431324155174],"12":[-0.011015526964565358,0.17495954159548935],"13":[-0.35612534445256916,0.4355367121728019],"14":[0.8083581253680809,-0.3905562287059248],"2":[-0.8172910990866016,0.32376247349591875],"3":[0.1570810044630715,-0.5546962694608853],"4":[-0.1343029889959071,-0.022563134782480503],"5":[0.0271896160460196,0.7351840882226742],"6":[-1.046165508232688,-0.20491107595703953],"7":[1.2781533699086591,-0.3722266628588799],"8":[-1.8,-0.4515456212125839],"9":[0.8369374768351313,0.018562863500093597]}},"id":"1343","type":"StaticLayoutProvider"},{"attributes":{},"id":"1416","type":"NodesOnly"},{"attributes":{"coordinates":null,"edge_renderer":{"id":"1341"},"group":null,"inspection_policy":{"id":"1364"},"layout_provider":{"id":"1343"},"node_renderer":{"id":"1337"},"selection_policy":{"id":"1416"}},"id":"1334","type":"GraphRenderer"},{"attributes":{"fill_color":{"value":"#2b83ba"},"size":{"value":25}},"id":"1344","type":"Circle"}],"root_ids":["1331"]},"title":"Bokeh Application","version":"2.4.3"}};
659
+ const render_items = [{"docid":"5837c009-ac4b-4df6-9471-bd6b0d156b93","root_ids":["1331"],"roots":{"1331":"b16c5955-5218-48ed-a187-6639f276eb5a"}}];
660
+ root.Bokeh.embed.embed_items_notebook(docs_json, render_items);
661
+ }
662
+ if (root.Bokeh !== undefined) {
663
+ embed_document(root);
664
+ } else {
665
+ let attempts = 0;
666
+ const timer = setInterval(function(root) {
667
+ if (root.Bokeh !== undefined) {
668
+ clearInterval(timer);
669
+ embed_document(root);
670
+ } else {
671
+ attempts++;
672
+ if (attempts > 100) {
673
+ clearInterval(timer);
674
+ console.log("Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing");
675
+ }
676
+ }
677
+ }, 10, root)
678
+ }
679
+ })(window);
680
+ </script>
681
+ </div>
682
+
683
+ </div>
684
+
685
+ </div>
686
+ </div>
687
+
688
+ </div>
689
+