{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Interaktionen" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "hide_input": true }, "outputs": [ { "data": { "text/html": [ "\n", "
\n", " \n", " Loading BokehJS ...\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function now() {\n", " return new Date();\n", " }\n", "\n", " const force = true;\n", "\n", " if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n", " root._bokeh_onload_callbacks = [];\n", " root._bokeh_is_loading = undefined;\n", " }\n", "\n", "const JS_MIME_TYPE = 'application/javascript';\n", " const HTML_MIME_TYPE = 'text/html';\n", " const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n", " const CLASS_NAME = 'output_bokeh rendered_html';\n", "\n", " /**\n", " * Render data to the DOM node\n", " */\n", " function render(props, node) {\n", " const script = document.createElement(\"script\");\n", " node.appendChild(script);\n", " }\n", "\n", " /**\n", " * Handle when an output is cleared or removed\n", " */\n", " function handleClearOutput(event, handle) {\n", " const cell = handle.cell;\n", "\n", " const id = cell.output_area._bokeh_element_id;\n", " const server_id = cell.output_area._bokeh_server_id;\n", " // Clean up Bokeh references\n", " if (id != null && id in Bokeh.index) {\n", " Bokeh.index[id].model.document.clear();\n", " delete Bokeh.index[id];\n", " }\n", "\n", " if (server_id !== undefined) {\n", " // Clean up Bokeh references\n", " const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n", " cell.notebook.kernel.execute(cmd_clean, {\n", " iopub: {\n", " output: function(msg) {\n", " const id = msg.content.text.trim();\n", " if (id in Bokeh.index) {\n", " Bokeh.index[id].model.document.clear();\n", " delete Bokeh.index[id];\n", " }\n", " }\n", " }\n", " });\n", " // Destroy server and session\n", " const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n", " cell.notebook.kernel.execute(cmd_destroy);\n", " }\n", " }\n", "\n", " /**\n", " * Handle when a new output is added\n", " */\n", " function handleAddOutput(event, handle) {\n", " const output_area = handle.output_area;\n", " const output = handle.output;\n", "\n", " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n", " if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n", " return\n", " }\n", "\n", " const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", "\n", " if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n", " toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n", " // store reference to embed id on output_area\n", " output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", " }\n", " if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", " const bk_div = document.createElement(\"div\");\n", " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", " const script_attrs = bk_div.children[0].attributes;\n", " for (let i = 0; i < script_attrs.length; i++) {\n", " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n", " toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n", " }\n", " // store reference to server id on output_area\n", " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", " }\n", " }\n", "\n", " function register_renderer(events, OutputArea) {\n", "\n", " function append_mime(data, metadata, element) {\n", " // create a DOM node to render to\n", " const toinsert = this.create_output_subarea(\n", " metadata,\n", " CLASS_NAME,\n", " EXEC_MIME_TYPE\n", " );\n", " this.keyboard_manager.register_events(toinsert);\n", " // Render to node\n", " const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", " render(props, toinsert[toinsert.length - 1]);\n", " element.append(toinsert);\n", " return toinsert\n", " }\n", "\n", " /* Handle when an output is cleared or removed */\n", " events.on('clear_output.CodeCell', handleClearOutput);\n", " events.on('delete.Cell', handleClearOutput);\n", "\n", " /* Handle when a new output is added */\n", " events.on('output_added.OutputArea', handleAddOutput);\n", "\n", " /**\n", " * Register the mime type and append_mime function with output_area\n", " */\n", " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", " /* Is output safe? */\n", " safe: true,\n", " /* Index of renderer in `output_area.display_order` */\n", " index: 0\n", " });\n", " }\n", "\n", " // register the mime type if in Jupyter Notebook environment and previously unregistered\n", " if (root.Jupyter !== undefined) {\n", " const events = require('base/js/events');\n", " const OutputArea = require('notebook/js/outputarea').OutputArea;\n", "\n", " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", " register_renderer(events, OutputArea);\n", " }\n", " }\n", " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n", " root._bokeh_timeout = Date.now() + 5000;\n", " root._bokeh_failed_load = false;\n", " }\n", "\n", " const NB_LOAD_WARNING = {'data': {'text/html':\n", " \"
\\n\"+\n", " \"

\\n\"+\n", " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", " \"

\\n\"+\n", " \"\\n\"+\n", " \"\\n\"+\n", " \"from bokeh.resources import INLINE\\n\"+\n", " \"output_notebook(resources=INLINE)\\n\"+\n", " \"\\n\"+\n", " \"
\"}};\n", "\n", " function display_loaded() {\n", " const el = document.getElementById(\"cdc4df91-83ce-40ea-b17c-46686e649589\");\n", " if (el != null) {\n", " el.textContent = \"BokehJS is loading...\";\n", " }\n", " if (root.Bokeh !== undefined) {\n", " if (el != null) {\n", " el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n", " }\n", " } else if (Date.now() < root._bokeh_timeout) {\n", " setTimeout(display_loaded, 100)\n", " }\n", " }\n", "\n", " function run_callbacks() {\n", " try {\n", " root._bokeh_onload_callbacks.forEach(function(callback) {\n", " if (callback != null)\n", " callback();\n", " });\n", " } finally {\n", " delete root._bokeh_onload_callbacks\n", " }\n", " console.debug(\"Bokeh: all callbacks have finished\");\n", " }\n", "\n", " function load_libs(css_urls, js_urls, callback) {\n", " if (css_urls == null) css_urls = [];\n", " if (js_urls == null) js_urls = [];\n", "\n", " root._bokeh_onload_callbacks.push(callback);\n", " if (root._bokeh_is_loading > 0) {\n", " console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", " return null;\n", " }\n", " if (js_urls == null || js_urls.length === 0) {\n", " run_callbacks();\n", " return null;\n", " }\n", " console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", " root._bokeh_is_loading = css_urls.length + js_urls.length;\n", "\n", " function on_load() {\n", " root._bokeh_is_loading--;\n", " if (root._bokeh_is_loading === 0) {\n", " console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n", " run_callbacks()\n", " }\n", " }\n", "\n", " function on_error(url) {\n", " console.error(\"failed to load \" + url);\n", " }\n", "\n", " for (let i = 0; i < css_urls.length; i++) {\n", " const url = css_urls[i];\n", " const element = document.createElement(\"link\");\n", " element.onload = on_load;\n", " element.onerror = on_error.bind(null, url);\n", " element.rel = \"stylesheet\";\n", " element.type = \"text/css\";\n", " element.href = url;\n", " console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n", " document.body.appendChild(element);\n", " }\n", "\n", " for (let i = 0; i < js_urls.length; i++) {\n", " const url = js_urls[i];\n", " const element = document.createElement('script');\n", " element.onload = on_load;\n", " element.onerror = on_error.bind(null, url);\n", " element.async = false;\n", " element.src = url;\n", " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", " document.head.appendChild(element);\n", " }\n", " };\n", "\n", " function inject_raw_css(css) {\n", " const element = document.createElement(\"style\");\n", " element.appendChild(document.createTextNode(css));\n", " document.body.appendChild(element);\n", " }\n", "\n", " const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.1.1.min.js\"];\n", " const css_urls = [];\n", "\n", " const inline_js = [ function(Bokeh) {\n", " Bokeh.set_log_level(\"info\");\n", " },\n", "function(Bokeh) {\n", " }\n", " ];\n", "\n", " function run_inline_js() {\n", " if (root.Bokeh !== undefined || force === true) {\n", " for (let i = 0; i < inline_js.length; i++) {\n", " inline_js[i].call(root, root.Bokeh);\n", " }\n", "if (force === true) {\n", " display_loaded();\n", " }} else if (Date.now() < root._bokeh_timeout) {\n", " setTimeout(run_inline_js, 100);\n", " } else if (!root._bokeh_failed_load) {\n", " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", " root._bokeh_failed_load = true;\n", " } else if (force !== true) {\n", " const cell = $(document.getElementById(\"cdc4df91-83ce-40ea-b17c-46686e649589\")).parents('.cell').data().cell;\n", " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n", " }\n", " }\n", "\n", " if (root._bokeh_is_loading === 0) {\n", " console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", " run_inline_js();\n", " } else {\n", " load_libs(css_urls, js_urls, function() {\n", " console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n", " run_inline_js();\n", " });\n", " }\n", "}(window));" ], "application/vnd.bokehjs_load.v0+json": "(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\n\n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n const el = document.getElementById(\"cdc4df91-83ce-40ea-b17c-46686e649589\");\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.1.1.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\nif (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n const cell = $(document.getElementById(\"cdc4df91-83ce-40ea-b17c-46686e649589\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));" }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from bokeh.io import output_notebook, show\n", "from bokeh.plotting import figure\n", "\n", "\n", "output_notebook()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Verknüpfte Interaktionen\n", "\n", "Es ist möglich, verschiedenen Bokeh-Plots interaktiv zu verknüpfen. Z.B. können zwei oder mehr Plots verknüpft werden, wobei in einem der Plots verschoben, gezoomt o.ä. wird und die anderen Plots gleichzeitig aktualisiert werden. Es ist auch möglich, Auswahlen zwischen zwei Plots zu verknüpfen, sodass bei der Auswahl von Elementen in einem Plot auch die entsprechenden Elemente im zweiten Plot ausgewählt werden." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Verknüpftes Verschieben\n", "\n", "Verknüpftes Verschieben (wenn mehrere Darstellungen Bereiche haben, die synchron bleiben) ist mit Bokeh einfach zu realisieren. Ihr teilt einfach die entsprechenden Bereichsobjekte zwischen zwei (oder mehr) Plots auf. Das folgende Beispiel zeigt, wie ihr dies erreicht, indem ihr die Bereiche der drei Diagramme auf verschiedene Weise verknüpft:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " const docs_json = {\"23e826bb-4870-4d5f-a6a8-03ae1d62151d\":{\"version\":\"3.1.1\",\"title\":\"Bokeh Application\",\"defs\":[],\"roots\":[{\"type\":\"object\",\"name\":\"GridPlot\",\"id\":\"p1178\",\"attributes\":{\"rows\":null,\"cols\":null,\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1177\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p1175\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1032\"},{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1075\"},{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1119\"}]}},{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p1176\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1033\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1076\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1120\"}]}}]}},\"children\":[[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1001\",\"attributes\":{\"width\":250,\"height\":250,\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1002\"},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1003\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1014\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1016\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1008\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1043\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1037\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1039\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1038\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",[0,1,2,3,4,5,6,7,8,9,10]],[\"y\",[0,1,2,3,4,5,6,7,8,9,10]]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1044\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1045\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1040\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"size\":{\"type\":\"value\",\"value\":10},\"line_color\":{\"type\":\"value\",\"value\":\"navy\"},\"fill_color\":{\"type\":\"value\",\"value\":\"navy\"},\"hatch_color\":{\"type\":\"value\",\"value\":\"navy\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1041\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"size\":{\"type\":\"value\",\"value\":10},\"line_color\":{\"type\":\"value\",\"value\":\"navy\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"navy\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_color\":{\"type\":\"value\",\"value\":\"navy\"},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1042\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"size\":{\"type\":\"value\",\"value\":10},\"line_color\":{\"type\":\"value\",\"value\":\"navy\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"navy\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_color\":{\"type\":\"value\",\"value\":\"navy\"},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1007\",\"attributes\":{\"tools\":[{\"id\":\"p1032\"},{\"id\":\"p1033\"}]}},\"toolbar_location\":null,\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1025\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1026\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1028\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1027\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1018\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1019\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1021\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1020\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1024\",\"attributes\":{\"axis\":{\"id\":\"p1018\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1031\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1025\"}}}]}},0,0],[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1046\",\"attributes\":{\"width\":250,\"height\":250,\"x_range\":{\"id\":\"p1002\"},\"y_range\":{\"id\":\"p1003\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1057\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1059\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1053\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1086\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1080\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1082\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1081\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",[0,1,2,3,4,5,6,7,8,9,10]],[\"y\",[10,9,8,7,6,5,4,3,2,1,0]]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1087\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1088\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Scatter\",\"id\":\"p1083\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"size\":{\"type\":\"value\",\"value\":10},\"line_color\":{\"type\":\"value\",\"value\":\"firebrick\"},\"fill_color\":{\"type\":\"value\",\"value\":\"firebrick\"},\"hatch_color\":{\"type\":\"value\",\"value\":\"firebrick\"},\"marker\":{\"type\":\"value\",\"value\":\"triangle\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Scatter\",\"id\":\"p1084\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"size\":{\"type\":\"value\",\"value\":10},\"line_color\":{\"type\":\"value\",\"value\":\"firebrick\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"firebrick\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_color\":{\"type\":\"value\",\"value\":\"firebrick\"},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1},\"marker\":{\"type\":\"value\",\"value\":\"triangle\"}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Scatter\",\"id\":\"p1085\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"size\":{\"type\":\"value\",\"value\":10},\"line_color\":{\"type\":\"value\",\"value\":\"firebrick\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"firebrick\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_color\":{\"type\":\"value\",\"value\":\"firebrick\"},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2},\"marker\":{\"type\":\"value\",\"value\":\"triangle\"}}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1052\",\"attributes\":{\"tools\":[{\"id\":\"p1075\"},{\"id\":\"p1076\"}]}},\"toolbar_location\":null,\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1068\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1069\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1071\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1070\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1061\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1062\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1064\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1063\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1067\",\"attributes\":{\"axis\":{\"id\":\"p1061\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1074\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1068\"}}}]}},0,1],[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1089\",\"attributes\":{\"width\":250,\"height\":250,\"x_range\":{\"id\":\"p1002\"},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1091\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1101\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1103\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1096\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1130\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1124\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1126\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1125\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",[0,1,2,3,4,5,6,7,8,9,10]],[\"y\",[5,4,3,2,1,0,1,2,3,4,5]]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1131\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1132\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Scatter\",\"id\":\"p1127\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"size\":{\"type\":\"value\",\"value\":10},\"line_color\":{\"type\":\"value\",\"value\":\"olive\"},\"fill_color\":{\"type\":\"value\",\"value\":\"olive\"},\"hatch_color\":{\"type\":\"value\",\"value\":\"olive\"},\"marker\":{\"type\":\"value\",\"value\":\"square\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Scatter\",\"id\":\"p1128\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"size\":{\"type\":\"value\",\"value\":10},\"line_color\":{\"type\":\"value\",\"value\":\"olive\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"olive\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_color\":{\"type\":\"value\",\"value\":\"olive\"},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1},\"marker\":{\"type\":\"value\",\"value\":\"square\"}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Scatter\",\"id\":\"p1129\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"size\":{\"type\":\"value\",\"value\":10},\"line_color\":{\"type\":\"value\",\"value\":\"olive\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"olive\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_color\":{\"type\":\"value\",\"value\":\"olive\"},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2},\"marker\":{\"type\":\"value\",\"value\":\"square\"}}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1095\",\"attributes\":{\"tools\":[{\"id\":\"p1119\"},{\"id\":\"p1120\"}]}},\"toolbar_location\":null,\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1112\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1113\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1115\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1114\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1105\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1106\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1108\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1107\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1111\",\"attributes\":{\"axis\":{\"id\":\"p1105\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1118\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1112\"}}}]}},0,2]]}}],\"callbacks\":{\"type\":\"map\"}}};\n", " const render_items = [{\"docid\":\"23e826bb-4870-4d5f-a6a8-03ae1d62151d\",\"roots\":{\"p1178\":\"ceb3b81c-9cec-4d8a-b3d5-9b778bce0d43\"},\"root_ids\":[\"p1178\"]}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " let attempts = 0;\n", " const timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " clearInterval(timer);\n", " embed_document(root);\n", " } else {\n", " attempts++;\n", " if (attempts > 100) {\n", " clearInterval(timer);\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " }\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "p1178" } }, "output_type": "display_data" } ], "source": [ "from bokeh.layouts import gridplot\n", "\n", "\n", "x = list(range(11))\n", "y0, y1, y2 = x, [10 - i for i in x], [abs(i - 5) for i in x]\n", "\n", "plot_options = dict(width=250, height=250, tools=\"pan,wheel_zoom\")\n", "\n", "# create a new plot\n", "s1 = figure(**plot_options)\n", "s1.circle(x, y0, size=10, color=\"navy\")\n", "\n", "# create a new plot and share both ranges\n", "s2 = figure(x_range=s1.x_range, y_range=s1.y_range, **plot_options)\n", "s2.triangle(x, y1, size=10, color=\"firebrick\")\n", "\n", "# create a new plot and share only one range\n", "s3 = figure(x_range=s1.x_range, **plot_options)\n", "s3.square(x, y2, size=10, color=\"olive\")\n", "\n", "p = gridplot([[s1, s2, s3]])\n", "\n", "# show the results\n", "show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Verknüpfte Auswahl\n", "\n", "Das Verknüpfen von Auswahlen erfolgt auf ähnliche Weise, indem Datenquellen zwischen Plots gemeinsam genutzt werden. Beachtet, dass normalerweise mit `` bokeh.plotting`` und `` bokeh.charts`` die Erstellung einer Standarddatenquelle für einfache Darstellungen automatisch erfolgt. Um jedoch eine Datenquelle gemeinsam zu nutzen, müssen wir sie manuell erstellen und explizit übergeben. Dies wird im folgenden Beispiel veranschaulicht:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " const docs_json = {\"780d803b-d02f-4e7d-9e2e-633c23cda2bd\":{\"version\":\"3.1.1\",\"title\":\"Bokeh Application\",\"defs\":[],\"roots\":[{\"type\":\"object\",\"name\":\"GridPlot\",\"id\":\"p1559\",\"attributes\":{\"rows\":null,\"cols\":null,\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1558\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p1555\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"BoxSelectTool\",\"id\":\"p1448\",\"attributes\":{\"renderers\":\"auto\",\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1449\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"editable\":true,\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}},{\"type\":\"object\",\"name\":\"BoxSelectTool\",\"id\":\"p1499\",\"attributes\":{\"renderers\":\"auto\",\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1500\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"editable\":true,\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}}]}},{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p1556\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"LassoSelectTool\",\"id\":\"p1450\",\"attributes\":{\"renderers\":\"auto\",\"overlay\":{\"type\":\"object\",\"name\":\"PolyAnnotation\",\"id\":\"p1451\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"xs\":[],\"ys\":[],\"editable\":true,\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}},{\"type\":\"object\",\"name\":\"LassoSelectTool\",\"id\":\"p1501\",\"attributes\":{\"renderers\":\"auto\",\"overlay\":{\"type\":\"object\",\"name\":\"PolyAnnotation\",\"id\":\"p1502\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"xs\":[],\"ys\":[],\"editable\":true,\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}}]}},{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p1557\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p1452\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p1503\"}]}}]}},\"children\":[[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1417\",\"attributes\":{\"width\":300,\"height\":300,\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1418\"},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1419\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1430\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1432\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1424\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1465\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1414\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1416\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1415\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",[-20,-19,-18,-17,-16,-15,-14,-13,-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]],[\"y0\",[20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]],[\"y1\",[400,361,324,289,256,225,196,169,144,121,100,81,64,49,36,25,16,9,4,1,0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,256,289,324,361,400]]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1466\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1467\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1462\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y0\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1463\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y0\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1464\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y0\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1423\",\"attributes\":{\"tools\":[{\"id\":\"p1448\"},{\"id\":\"p1450\"},{\"id\":\"p1452\"}]}},\"toolbar_location\":null,\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1441\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1442\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1444\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1443\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1434\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1435\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1437\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1436\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1440\",\"attributes\":{\"axis\":{\"id\":\"p1434\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1447\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1441\"}}}]}},0,0],[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1468\",\"attributes\":{\"width\":300,\"height\":300,\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1469\"},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1470\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1481\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1483\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1475\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1516\",\"attributes\":{\"data_source\":{\"id\":\"p1414\"},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1517\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1518\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1513\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y1\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1514\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y1\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1515\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y1\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1474\",\"attributes\":{\"tools\":[{\"id\":\"p1499\"},{\"id\":\"p1501\"},{\"id\":\"p1503\"}]}},\"toolbar_location\":null,\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1492\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1493\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1495\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1494\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1485\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1486\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1488\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1487\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1491\",\"attributes\":{\"axis\":{\"id\":\"p1485\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1498\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1492\"}}}]}},0,1]]}}],\"callbacks\":{\"type\":\"map\"}}};\n", " const render_items = [{\"docid\":\"780d803b-d02f-4e7d-9e2e-633c23cda2bd\",\"roots\":{\"p1559\":\"bf6a3f30-0272-40f4-98eb-664a4907aa09\"},\"root_ids\":[\"p1559\"]}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " let attempts = 0;\n", " const timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " clearInterval(timer);\n", " embed_document(root);\n", " } else {\n", " attempts++;\n", " if (attempts > 100) {\n", " clearInterval(timer);\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " }\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "p1559" } }, "output_type": "display_data" } ], "source": [ "from bokeh.models import ColumnDataSource\n", "\n", "\n", "x = list(range(-20, 21))\n", "y0, y1 = [abs(xx) for xx in x], [xx**2 for xx in x]\n", "\n", "# create a column data source for the plots to share\n", "source = ColumnDataSource(data=dict(x=x, y0=y0, y1=y1))\n", "\n", "TOOLS = \"box_select,lasso_select,help\"\n", "\n", "# create a new plot and add a renderer\n", "left = figure(tools=TOOLS, width=300, height=300)\n", "left.circle(\"x\", \"y0\", source=source)\n", "\n", "# create another new plot and add a renderer\n", "right = figure(tools=TOOLS, width=300, height=300)\n", "right.circle(\"x\", \"y1\", source=source)\n", "\n", "p = gridplot([[left, right]])\n", "\n", "show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Hover Tool\n", "\n", "Bokeh verfügt über ein Hover-Tool, mit dem zusätzliche Informationen in einem Popup angezeigt werden können, wenn der Mauszeiger über einer bestimmten Glyphe schwebt. Die grundlegende Konfiguration des Hover-Tools bedeutet, dass eine Liste von ``(name, format)``-Tupeln bereitgestellt wird. Die vollständigen Details findet ihr im [User’s Guide](https://docs.bokeh.org/en/latest/docs/user_guide/interaction/tools.html#hovertool).\n", "\n", "Das folgende Beispiel zeigt einige grundlegende Anwendungen des Hover-Werkzeugs mit einer Kreis-Glyphe, wobei die in `utils.py` definierten Hover-Informationen verwendet werden:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " const docs_json = {\"b3bf8c15-0ff8-40f6-b8aa-f60a1732ee41\":{\"version\":\"3.1.1\",\"title\":\"Bokeh Application\",\"defs\":[],\"roots\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1772\",\"attributes\":{\"width\":300,\"height\":300,\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1773\"},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1774\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1786\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1788\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1775\",\"attributes\":{\"text\":\"Mouse over the dots\"}},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1812\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1768\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1770\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1769\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",[1,2,3,4,5]],[\"y\",[2,5,8,2,7]],[\"desc\",[\"A\",\"b\",\"C\",\"d\",\"E\"]]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1813\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1814\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1809\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"size\":{\"type\":\"value\",\"value\":20},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1810\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"size\":{\"type\":\"value\",\"value\":20},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1811\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"size\":{\"type\":\"value\",\"value\":20},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1780\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"HoverTool\",\"id\":\"p1771\",\"attributes\":{\"renderers\":\"auto\",\"tooltips\":[[\"index\",\"$index\"],[\"(x,y)\",\"($x, $y)\"],[\"desc\",\"@desc\"]]}}]}},\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1797\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1798\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1800\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1799\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1790\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1791\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1793\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1792\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1796\",\"attributes\":{\"axis\":{\"id\":\"p1790\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1803\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1797\"}}}]}}],\"callbacks\":{\"type\":\"map\"}}};\n", " const render_items = [{\"docid\":\"b3bf8c15-0ff8-40f6-b8aa-f60a1732ee41\",\"roots\":{\"p1772\":\"a3c79cc0-46b6-40a1-b2d4-50c2b49e4814\"},\"root_ids\":[\"p1772\"]}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " let attempts = 0;\n", " const timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " clearInterval(timer);\n", " embed_document(root);\n", " } else {\n", " attempts++;\n", " if (attempts > 100) {\n", " clearInterval(timer);\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " }\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "p1772" } }, "output_type": "display_data" } ], "source": [ "from bokeh.models import HoverTool\n", "\n", "\n", "source = ColumnDataSource(\n", " data=dict(\n", " x=[1, 2, 3, 4, 5],\n", " y=[2, 5, 8, 2, 7],\n", " desc=[\"A\", \"b\", \"C\", \"d\", \"E\"],\n", " )\n", ")\n", "\n", "hover = HoverTool(\n", " tooltips=[\n", " (\"index\", \"$index\"),\n", " (\"(x,y)\", \"($x, $y)\"),\n", " (\"desc\", \"@desc\"),\n", " ]\n", ")\n", "\n", "p = figure(\n", " width=300, height=300, tools=[hover], title=\"Mouse over the dots\"\n", ")\n", "\n", "p.circle(\"x\", \"y\", size=20, source=source)\n", "\n", "show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Widgets\n", "\n", "Bokeh unterstützt die direkte Integration mit einem kleinen grundlegenden Widget-Set. Dies kann in Verbindung mit einem Bokeh-Server oder mit `` CustomJS``-Modellen verwendet werden, um eure Dokumente interaktiver zu gestalten. Eine vollständige Liste mit Beispielcode findet ihr im Abschnitt [Adding Widgets](https://docs.bokeh.org/en/latest/docs/user_guide/interaction/widgets.html) des Benutzerhandbuchs.\n", "\n", "Um die Widgets zu verwenden, fügt sie wie ein Plotobjekt in ein Layout ein:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " const docs_json = {\"b7a5bfa5-1cf4-4669-9553-e10583fa22e5\":{\"version\":\"3.1.1\",\"title\":\"Bokeh Application\",\"defs\":[],\"roots\":[{\"type\":\"object\",\"name\":\"Column\",\"id\":\"p1955\",\"attributes\":{\"children\":[{\"type\":\"object\",\"name\":\"Slider\",\"id\":\"p1954\",\"attributes\":{\"title\":\"foo\",\"start\":0,\"end\":10,\"value\":1,\"step\":0.1}}]}}],\"callbacks\":{\"type\":\"map\"}}};\n", " const render_items = [{\"docid\":\"b7a5bfa5-1cf4-4669-9553-e10583fa22e5\",\"roots\":{\"p1955\":\"fa7e8e7d-ae24-45e6-abc4-68d253277a03\"},\"root_ids\":[\"p1955\"]}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " let attempts = 0;\n", " const timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " clearInterval(timer);\n", " embed_document(root);\n", " } else {\n", " attempts++;\n", " if (attempts > 100) {\n", " clearInterval(timer);\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " }\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "p1955" } }, "output_type": "display_data" } ], "source": [ "from bokeh.models import Column\n", "from bokeh.models.widgets import Slider\n", "\n", "\n", "slider = Slider(start=0, end=10, value=1, step=0.1, title=\"foo\")\n", "\n", "show(Column(slider))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## CustomJS Callbacks\n", "\n", "Damit ein Widget nützlich wird, muss es Aktionen ausführen können. Mit Hilfe des Bokeh-Servers können Widgets echten Python-Code ausführen. Diese Möglichkeit wird unter [Bokeh-Server](bokeh-server.ipynb) erläutert. Hier betrachten wir, wie Widgets mit CustomJS-Callbacks konfiguriert werden können, die JavaScript-Code-Snippets ausführen." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " const docs_json = {\"7717b4bd-f8f1-46a9-9439-3702c9298522\":{\"version\":\"3.1.1\",\"title\":\"Bokeh Application\",\"defs\":[],\"roots\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p2037\",\"attributes\":{\"height\":300,\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p2038\"},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p2039\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p2050\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p2052\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p2044\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p2076\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p2070\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p2072\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p2071\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",[1,2,3,4,5]],[\"y\",[2,5,8,2,7]]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p2077\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p2078\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p2073\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"size\":{\"type\":\"value\",\"value\":20},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p2074\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"size\":{\"type\":\"value\",\"value\":20},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p2075\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"size\":{\"type\":\"value\",\"value\":20},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p2043\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"TapTool\",\"id\":\"p2036\",\"attributes\":{\"renderers\":\"auto\",\"callback\":{\"type\":\"object\",\"name\":\"CustomJS\",\"id\":\"p2035\",\"attributes\":{\"code\":\"alert('you tapped a circle!')\"}}}}]}},\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p2061\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p2062\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p2064\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p2063\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p2054\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p2055\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p2057\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p2056\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p2060\",\"attributes\":{\"axis\":{\"id\":\"p2054\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p2067\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p2061\"}}}]}}],\"callbacks\":{\"type\":\"map\"}}};\n", " const render_items = [{\"docid\":\"7717b4bd-f8f1-46a9-9439-3702c9298522\",\"roots\":{\"p2037\":\"c48c5378-e14e-4b30-8680-e4e23cef7001\"},\"root_ids\":[\"p2037\"]}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " let attempts = 0;\n", " const timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " clearInterval(timer);\n", " embed_document(root);\n", " } else {\n", " attempts++;\n", " if (attempts > 100) {\n", " clearInterval(timer);\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " }\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "p2037" } }, "output_type": "display_data" } ], "source": [ "from bokeh.models import ColumnDataSource, CustomJS, TapTool\n", "\n", "\n", "callback = CustomJS(code=\"alert('you tapped a circle!')\")\n", "tap = TapTool(callback=callback)\n", "\n", "p = figure(width=600, height=300, tools=[tap])\n", "\n", "p.circle(x=[1, 2, 3, 4, 5], y=[2, 5, 8, 2, 7], size=20)\n", "\n", "show(p)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Beispiel für ein Slider-Widget\n", "\n", "Das folgende Beispiel zeigt eine an einen Slider angehängte Aktion, mit der eine Datenquelle aktualisiert wird." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " const docs_json = {\"0452ca49-5588-43d2-959d-630b0bdf2b82\":{\"version\":\"3.1.1\",\"title\":\"Bokeh Application\",\"defs\":[],\"roots\":[{\"type\":\"object\",\"name\":\"Column\",\"id\":\"p2296\",\"attributes\":{\"children\":[{\"type\":\"object\",\"name\":\"Slider\",\"id\":\"p2294\",\"attributes\":{\"js_property_callbacks\":{\"type\":\"map\",\"entries\":[[\"change:value\",[{\"type\":\"object\",\"name\":\"CustomJS\",\"id\":\"p2295\",\"attributes\":{\"args\":{\"type\":\"map\",\"entries\":[[\"source\",{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p2236\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p2238\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p2237\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",[0.0,0.005,0.01,0.015,0.02,0.025,0.03,0.035,0.04,0.045,0.05,0.055,0.06,0.065,0.07,0.075,0.08,0.085,0.09,0.095,0.1,0.105,0.11,0.115,0.12,0.125,0.13,0.135,0.14,0.145,0.15,0.155,0.16,0.165,0.17,0.17500000000000002,0.18,0.185,0.19,0.195,0.2,0.20500000000000002,0.21,0.215,0.22,0.225,0.23,0.23500000000000001,0.24,0.245,0.25,0.255,0.26,0.265,0.27,0.275,0.28,0.28500000000000003,0.29,0.295,0.3,0.305,0.31,0.315,0.32,0.325,0.33,0.335,0.34,0.34500000000000003,0.35000000000000003,0.355,0.36,0.365,0.37,0.375,0.38,0.385,0.39,0.395,0.4,0.405,0.41000000000000003,0.41500000000000004,0.42,0.425,0.43,0.435,0.44,0.445,0.45,0.455,0.46,0.465,0.47000000000000003,0.47500000000000003,0.48,0.485,0.49,0.495,0.5,0.505,0.51,0.515,0.52,0.525,0.53,0.535,0.54,0.545,0.55,0.555,0.56,0.5650000000000001,0.5700000000000001,0.5750000000000001,0.58,0.585,0.59,0.595,0.6,0.605,0.61,0.615,0.62,0.625,0.63,0.635,0.64,0.645,0.65,0.655,0.66,0.665,0.67,0.675,0.68,0.685,0.6900000000000001,0.6950000000000001,0.7000000000000001,0.705,0.71,0.715,0.72,0.725,0.73,0.735,0.74,0.745,0.75,0.755,0.76,0.765,0.77,0.775,0.78,0.785,0.79,0.795,0.8,0.805,0.81,0.8150000000000001,0.8200000000000001,0.8250000000000001,0.8300000000000001,0.835,0.84,0.845,0.85,0.855,0.86,0.865,0.87,0.875,0.88,0.885,0.89,0.895,0.9,0.905,0.91,0.915,0.92,0.925,0.93,0.935,0.9400000000000001,0.9450000000000001,0.9500000000000001,0.9550000000000001,0.96,0.965,0.97,0.975,0.98,0.985,0.99,0.995,1.0]],[\"y\",[0.0,0.005,0.01,0.015,0.02,0.025,0.03,0.035,0.04,0.045,0.05,0.055,0.06,0.065,0.07,0.075,0.08,0.085,0.09,0.095,0.1,0.105,0.11,0.115,0.12,0.125,0.13,0.135,0.14,0.145,0.15,0.155,0.16,0.165,0.17,0.17500000000000002,0.18,0.185,0.19,0.195,0.2,0.20500000000000002,0.21,0.215,0.22,0.225,0.23,0.23500000000000001,0.24,0.245,0.25,0.255,0.26,0.265,0.27,0.275,0.28,0.28500000000000003,0.29,0.295,0.3,0.305,0.31,0.315,0.32,0.325,0.33,0.335,0.34,0.34500000000000003,0.35000000000000003,0.355,0.36,0.365,0.37,0.375,0.38,0.385,0.39,0.395,0.4,0.405,0.41000000000000003,0.41500000000000004,0.42,0.425,0.43,0.435,0.44,0.445,0.45,0.455,0.46,0.465,0.47000000000000003,0.47500000000000003,0.48,0.485,0.49,0.495,0.5,0.505,0.51,0.515,0.52,0.525,0.53,0.535,0.54,0.545,0.55,0.555,0.56,0.5650000000000001,0.5700000000000001,0.5750000000000001,0.58,0.585,0.59,0.595,0.6,0.605,0.61,0.615,0.62,0.625,0.63,0.635,0.64,0.645,0.65,0.655,0.66,0.665,0.67,0.675,0.68,0.685,0.6900000000000001,0.6950000000000001,0.7000000000000001,0.705,0.71,0.715,0.72,0.725,0.73,0.735,0.74,0.745,0.75,0.755,0.76,0.765,0.77,0.775,0.78,0.785,0.79,0.795,0.8,0.805,0.81,0.8150000000000001,0.8200000000000001,0.8250000000000001,0.8300000000000001,0.835,0.84,0.845,0.85,0.855,0.86,0.865,0.87,0.875,0.88,0.885,0.89,0.895,0.9,0.905,0.91,0.915,0.92,0.925,0.93,0.935,0.9400000000000001,0.9450000000000001,0.9500000000000001,0.9550000000000001,0.96,0.965,0.97,0.975,0.98,0.985,0.99,0.995,1.0]]]}}}],[\"slider\",{\"id\":\"p2294\"}]]},\"code\":\"\\n var data = source.data;\\n var f = slider.value;\\n x = data['x']\\n y = data['y']\\n for (i = 0; i < x.length; i++) {\\n y[i] = Math.pow(x[i], f)\\n }\\n\\n // necessary because we mutated source.data in-place\\n source.change.emit();\\n\"}}]]]},\"title\":\"power\",\"start\":0.1,\"end\":6,\"value\":1,\"step\":0.1}},{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p2239\",\"attributes\":{\"width\":400,\"height\":400,\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p2240\"},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p2241\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p2252\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p2254\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p2246\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p2291\",\"attributes\":{\"data_source\":{\"id\":\"p2236\"},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p2292\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p2293\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2288\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.6,\"line_width\":3}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2289\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.1,\"line_width\":3}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p2290\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1f77b4\",\"line_alpha\":0.2,\"line_width\":3}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p2245\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p2270\"},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p2271\"},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p2272\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p2273\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"bottom_units\":\"canvas\",\"top_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\":\"SaveTool\",\"id\":\"p2274\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p2275\"},{\"type\":\"object\",\"name\":\"HelpTool\",\"id\":\"p2276\"}]}},\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p2263\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p2264\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p2266\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p2265\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p2256\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p2257\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p2259\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p2258\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p2262\",\"attributes\":{\"axis\":{\"id\":\"p2256\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p2269\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p2263\"}}}]}}]}}],\"callbacks\":{\"type\":\"map\"}}};\n", " const render_items = [{\"docid\":\"0452ca49-5588-43d2-959d-630b0bdf2b82\",\"roots\":{\"p2296\":\"fd3c979e-87ef-4d6e-bd3d-be4c8debb2eb\"},\"root_ids\":[\"p2296\"]}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " let attempts = 0;\n", " const timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " clearInterval(timer);\n", " embed_document(root);\n", " } else {\n", " attempts++;\n", " if (attempts > 100) {\n", " clearInterval(timer);\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " }\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "p2296" } }, "output_type": "display_data" } ], "source": [ "from bokeh.layouts import column\n", "from bokeh.models import ColumnDataSource, CustomJS, Slider\n", "\n", "\n", "x = [x * 0.005 for x in range(0, 201)]\n", "\n", "source = ColumnDataSource(data=dict(x=x, y=x))\n", "\n", "plot = figure(width=400, height=400)\n", "plot.line(\"x\", \"y\", source=source, line_width=3, line_alpha=0.6)\n", "\n", "slider = Slider(start=0.1, end=6, value=1, step=0.1, title=\"power\")\n", "\n", "update_curve = CustomJS(\n", " args=dict(source=source, slider=slider),\n", " code=\"\"\"\n", " var data = source.data;\n", " var f = slider.value;\n", " x = data['x']\n", " y = data['y']\n", " for (i = 0; i < x.length; i++) {\n", " y[i] = Math.pow(x[i], f)\n", " }\n", "\n", " // necessary becasue we mutated source.data in-place\n", " source.change.emit();\n", "\"\"\",\n", ")\n", "slider.js_on_change(\"value\", update_curve)\n", "\n", "\n", "show(column(slider, plot))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Beispiel für eine Datenauswahl\n", "\n", "Es ist auch möglich, JavaScript-Aktionen auszuführen, wenn sich eine Benutzerauswahl (z.B. Box, Punkt, Lasso) ändert. Dies geschieht durch Anhängen derselben Art von CustomJS-Objekt an die Datenquelle, für die die Auswahl getroffen wird.\n", "\n", "Das folgende Beispiel ist etwas komplexer und zeigt die Aktualisierung einer Datenquelle einer Glyphe als Reaktion auf die Auswahl einer anderen Glyphe:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " const docs_json = {\"a3d6bbff-1da6-4e51-945a-601fe0cd179b\":{\"version\":\"3.1.1\",\"title\":\"Bokeh Application\",\"defs\":[],\"roots\":[{\"type\":\"object\",\"name\":\"Row\",\"id\":\"p2572\",\"attributes\":{\"children\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p2479\",\"attributes\":{\"width\":400,\"height\":400,\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p2480\"},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p2481\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p2493\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p2495\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p2482\",\"attributes\":{\"text\":\"Select Here\"}},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p2522\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p2476\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p2478\",\"attributes\":{\"js_property_callbacks\":{\"type\":\"map\",\"entries\":[[\"change:indices\",[{\"type\":\"object\",\"name\":\"CustomJS\",\"id\":\"p2571\",\"attributes\":{\"args\":{\"type\":\"map\",\"entries\":[[\"s1\",{\"id\":\"p2476\"}],[\"s2\",{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p2525\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p2527\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p2526\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",[]],[\"y\",[]]]}}}]]},\"code\":\"\\n const inds = cb_obj.indices;\\n const d1 = s1.data;\\n const d2 = s2.data;\\n d2['x'] = []\\n d2['y'] = []\\n for (let i = 0; i < inds.length; i++) {\\n d2['x'].push(d1['x'][inds[i]])\\n d2['y'].push(d1['y'][inds[i]])\\n }\\n s2.change.emit();\\n \"}}]]]},\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p2477\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",[0.6172367162340641,0.5498784430768602,0.5267254109825166,0.08057955290704855,0.2788832905768217,0.6791420652035325,0.3181008509983796,0.09047483971610948,0.7620223047580764,0.6770529442999723,0.9862528712780134,0.5106405205249291,0.21558616125676178,0.3604343184624089,0.7610583745858334,0.6860593832830623,0.08914967045993061,0.10075720887607931,0.9233158063666347,0.13446979499047385,0.18403279854446908,0.4006852479765459,0.035040656054754815,0.8624835923152345,0.5070253500437069,0.19474212835343774,0.5431242816298961,0.06501257201407318,0.6982054951815643,0.6005737309552356,0.7828753658471896,0.35647812306102855,0.8906284467120527,0.05432790924890041,0.14303512050629152,0.6306341728823036,0.9157988246251645,0.48705369800136344,0.17909222551364135,0.9509675279465455,0.6491104922372778,0.4505917468381355,0.35061879033516063,0.2403733759777852,0.24775217876802658,0.1429997533762204,0.8876795068364088,0.6293758506160652,0.9036332425836173,0.9261765882657936,0.7788492111234819,0.40978796051183064,0.7661734844233208,0.2005713356365173,0.3595678583038485,0.06277431573269865,0.8188099162892498,0.09732737997034224,0.918063140114452,0.4812283344437759,0.16080319440934332,0.6859632594633925,0.5242479710189385,0.0037161622524388704,0.39413213589647367,0.34487343952701544,0.5112721863029804,0.9537437731391185,0.49173676979133674,0.8866211042974954,0.9638485119775231,0.5865866226981131,0.9587195132655381,0.7452651990484418,0.6551706649674242,0.2692351335518929,0.0193656136681567,0.9510604148806232,0.9344057404157605,0.4253973926144614,0.6382441893757682,0.9378732338292048,0.9324207529277384,0.8953535513757996,0.014119917168240348,0.02865749850139787,0.3742960256611022,0.8006796231931252,0.7119421025384238,0.04411825854421558,0.5677641341204448,0.148864231471455,0.14831517333447475,0.67910848875747,0.18577290110341416,0.24635694237459305,0.46280163292449494,0.4802562844022207,0.33821981810486235,0.7057453831599301,0.3244577195033228,0.5836522448845641,0.3299720529204332,0.45708616749875586,0.5921102948851102,0.9448238166324658,0.47598905912335043,0.7361159829069044,0.7624334453598675,0.1069364102495981,0.34812839168450016,0.7446018396274162,0.4623502420872535,0.22903543708350027,0.7607325996178763,0.3733042672314435,0.3178270657314104,0.9206276522029965,0.3053955155711693,0.9049143087423657,0.9512025935153452,0.33081292590806466,0.32787767306320903,0.7534683159673937,0.35424120105711465,0.032761433403696194,0.9766676176417185,0.20585723519512378,0.1469321005256773,0.5380812258509718,0.09862975008465258,0.2675866048063028,0.44941940676706427,0.3138008176923889,0.9022442867696707,0.20085737742534315,0.06627743397272312,0.7875086466391562,0.7404315501332707,0.19552456591584433,0.36291386604682907,0.21791010214009043,0.5257696515723542,0.7365082654688324,0.3696725879136976,0.8625825609994944,0.48339398385540044,0.19252037680272815,0.5098739579648125,0.8012663165055088,0.5873679908639262,0.0903521916613903,0.8720128177992674,0.8116000616117026,0.21119295457743703,0.5726186279192976,0.774312272374546,0.8209503752277337,0.7599605085148138,0.8108251360725619,0.6362232318874801,0.7522328099735002,0.17007905820458924,0.5413957088934832,0.9242643749412655,0.616316280883579,0.7295888502061318,0.24531461260547338,0.43934179831272335,0.10385767009562519,0.6524593020587158,0.5194112118587414,0.3649544955385906,0.020391790830272094,0.007841795942704843,0.4680551981322919,0.7601043122197437,0.6057415762036954,0.47856577313457294,0.017362432253888116,0.8696660489222718,0.8930289488314798,0.32711191246421834,0.47776131426288326,0.20203788558645785,0.45167096389526085,0.537455156719877,0.6354011237023084,0.008522541951698548,0.12911769521675853,0.9226951614224025,0.6985895826984891,0.945678711777325,0.10490277168059792,0.8641436241734127,0.06135034558037833,0.4362685834605936,0.0935992786719323,0.653249517932527,0.9162257847693105,0.02951464826394512,0.6091593908967274,0.38747126120717024,0.6992299886777158,0.09303738900708325,0.7348693816231261,0.7241615707654867,0.031136821161605432,0.3156220156316748,0.2573190909594425,0.43052821823425835,0.37728974706701757,0.8729208484377664,0.18560973807720105,0.7563220187653014,0.5345993461229597,0.09318839816453939,0.19367366808620523,0.9787799935639966,0.8126689807546179,0.23005299281755576,0.5363755217742324,0.816678862984288,0.1785887383519439,0.2501955461830466,0.6964405985999628,0.5883733253414849,0.2692457701553834,0.41963928211042956,0.320959011239318,0.9739504681569616,0.06142266870680102,0.5267539482602484,0.8465762246935243,0.7715315114050227,0.6306240258061518,0.1421674994211095,0.10694943696210879,0.43823214834678914,0.502353890568337,0.22796881525823198,0.3570197399341096,0.037521800570596286,0.41453344704340767,0.6332378565829332,0.38392170542577253,0.028203810426490783,0.35443578271328446,0.7026951944779767,0.9952231068905397,0.5376881081968159,0.7540130170376232,0.0740208124088837,0.8085696881232945,0.7330907648447,0.5306937351936271,0.31212839467167997,0.033480812885813505,0.1972652066286401,0.04713405664787684,0.023639038860139627,0.5973512582591574,0.17872521971606548,0.4471091105622601,0.3796884284432218,0.8591091008180439,0.6952317099491087,0.08128538863879164,0.7667473625960798,0.7082491410863215,0.8907905237054584,0.3717812052522833,0.9423282962160937,0.31361439165467764,0.21292751754598738,0.3619128100235173,0.6876494443125221,0.44763569992050234,0.6393494438584195,0.9793430622564218,0.01920615595197117,0.16635334304454685,0.9130467665345635,0.3931985228831735,0.13292070612584195,0.42773884509997917,0.758359225499763,0.5610410259065342,0.4152527922085567,0.7500264382037412,0.6280766496388628,0.1775472253253858,0.13345735272127257,0.9776528332306416,0.39894760629020243,0.8396567414397509,0.35047476453368775,0.22511493323969034,0.9282934080914271,0.509431131848271,0.040880093227282255,0.03382666179305727,0.08214814112413649,0.9221881532679493,0.8661065150907874,0.7636587097830037,0.6652598433179159,0.06468700615480927,0.456145387539423,0.8464238544102983,0.9186744427760323,0.6819732642363936,0.370989754208331,0.5460284814095094,0.739319827739242,0.7669200277310702,0.2692735616502162,0.667046163501943,0.5398663047594746,0.6893578639828158,0.665881709319576,0.9625337327659245,0.6458997373919215,0.5834564301654247,0.0920619970756903,0.6302795479785976,0.759072221809833,0.6940134224180595,0.5493117553181407,0.38591147166513795,0.8141010327626458,0.8040511404788545,0.406207404066655,0.503095553122539,0.8159768029916957,0.6495196847038647,0.8391800984913518,0.25550484136140317,0.962125993960191,0.6079813679545485,0.04977745260763855,0.25267278075392996,0.37432113066305894,0.9345102204011774,0.6911656579866711,0.9440103636368707,0.8720221286995151,0.27530707980806857,0.32662366252824293,0.6752393745127692,0.22930443717996296,0.20529052252067093,0.45641192004952236,0.1742385318554459,0.8658586456123669,0.5441108863983275,0.8101123931783053,0.988645702510127,0.5414524373482934,0.3202171674082087,0.1057981720415434,0.802414550142263,0.22256415657788498,0.5360548487751263,0.3933627936146864,0.27313652363198737,0.9922600338414328,0.2761445769178795,0.8672206106243326,0.5019355708038955,0.0983127669805256,0.8956168503002115,0.47555265388093837,0.631908041794109,0.040226240245699874,0.5211883597562765,0.4932116998285657,0.09107558317617259,0.38468025334625855,0.9322107142091914,0.46149062978105515,0.07751551061602091,0.593939682156706,0.581984778198917,0.5423866322823008,0.9746978134617436,0.7547982278454562,0.4873816489164291,0.30126358818494503,0.16814564458082704,0.745952737742182,0.5085918456455165,0.37948009321785714,0.4019145949942482,0.5018189950074001,0.6287469417432214,0.34864116339104245,0.2858586227870594,0.5910708083789215,0.45406291316232505,0.8218603197690714,0.2921584274722828,0.787024558843398,0.46795737822557104,0.32100888855116483,0.5920070905095275,0.48594651288328405,0.8736192893922076,0.3834727182669526,0.40617675799456776,0.6380364945420615,0.003015433990194216,0.9515386666744198,0.20525526554446638,0.3330269004668641,0.02772411816427156,0.4706216098082038,0.03542464629804676,0.6104053185610552,0.6177913036271774,0.3497258142469998,0.12747942910165755,0.12768147096083704,0.9719780128256709,0.9054534547787001,0.218726197877684,0.6793966887864137,0.4595071308552914,0.2235279593095586,0.6572784808051185,0.11645452984123117,0.36439285571498203,0.4314071279374915,0.24402268206872257,0.4123537947358461,0.7916147782980333,0.4382134790662767,0.7351618643151127,0.20651321698101643,0.8242500062461694,0.507060198883094,0.18129327184740895,0.5703314667545226,0.9069995007105882,0.46799568923484236,0.5245321544535629,0.05089335536908779,0.901225420897033,0.36272180374352037,0.8315907274351824,0.6682766055246752,0.2448955831946189,0.7987665670504466,0.2802534291007992,0.12929668156906804,0.398485651506888,0.19690746662311054,0.6706814750859179,0.9071467541339516,0.6212116501827684,0.7522022849472894,0.09494137903933508,0.02837516899290604,0.7550532108818369,0.17286542059392263,0.9147527620950943,0.07117426782448011,0.8721864956537578,0.29508276709263137,0.3498383170613706,0.033286194649534195,0.8974461183553747,0.7804658889991631,0.8469402686071408,0.5025486770758364,0.9742534457849731,0.8979068903268784,0.4565727026219093,0.16351293862892613,0.15607351535032832,0.09940638999891271,0.4605050733429803,0.8109827130501343,0.35022736742299787,0.3365967048669176,0.39830948584410997,0.040206456960121706,0.46844338449369904,0.7686270004119468,0.9867784535291575,0.09531037977610757,0.034250088313167115,0.464811820403196,0.8501610149509504,0.8223930469792714,0.9407760823116557,0.4371811343071137,0.0017034268937726749,0.8868506569604436,0.10938943945326707]],[\"y\",[0.23741299396219928,0.23298138014549952,0.0374018149001516,0.3946992968704869,0.34276888426479835,0.520050094770971,0.6266942762323066,0.6768128337600681,0.8995469218115593,0.2404720868626582,0.4702554825494697,0.6950456365231642,0.12853305960726835,0.1571581733401629,0.4608642206993121,0.7706937433291216,0.33382318418697665,0.04947621521474532,0.16559601470745322,0.12790520736686062,0.05949482574217646,0.41828059399242046,0.6793958406806698,0.19597075947316123,0.1975155340928504,0.31352982110357286,0.9468747379061796,0.14843305219141412,0.29618917442208426,0.7566906485032325,0.6572703231680271,0.26477417746536747,0.5525735696073534,0.6989119867079078,0.007812192485821212,0.8311724569127823,0.11945145932116574,0.9534493157852513,0.8523213843759189,0.8513970537124717,0.2585573583491716,0.036034374154020554,0.8291528066892824,0.9389588496906122,0.590419724147332,0.8574272620562075,0.7361230230068835,0.10377635483029024,0.9209559537445803,0.7370197457506389,0.7390586598571875,0.33230759307573765,0.5526251332450676,0.7793153070251032,0.37016736884778423,0.20803456411646348,0.8071615549144856,0.038846809111029224,0.5938086013811428,0.11675088029435077,0.35449172517157646,0.2751359496833373,0.45943357986959776,0.818927346018181,0.9312193886638419,0.6881293237934115,0.4011095908739116,0.9037832652608757,0.39035253185079744,0.31850272284572567,0.9757655343522617,0.3502803163229935,0.7117550695451215,0.09835960901532781,0.18680820490932892,0.4332853746298909,0.9230676799056352,0.4987106491667346,0.1462658717686114,0.1813982646194945,0.9606687611734562,0.761789691451808,0.2825470399922567,0.8892535214912461,0.6746682697155073,0.8879137418006432,0.35717940281235494,0.8520346613540375,0.6837979563610501,0.7731611081190146,0.3333832278318639,0.6479886223240477,0.610660622578176,0.8224448426214066,0.9243932479435505,0.47948123050187896,0.15078864101426281,0.6843662480463233,0.5183332114703697,0.6032775249082616,0.6636055309491514,0.8191194593433436,0.005441739408392765,0.04389438343011198,0.34919277208871113,0.263774237874286,0.1886347327072604,0.5306217773865198,0.19651811631597882,0.8810587810083085,0.1452087296909952,0.0031160015382984962,0.5314352823029319,0.07686348783225472,0.4248743307818871,0.6670675449227932,0.17504121048150378,0.016433360708188793,0.5265750445280596,0.14527918199337753,0.3404422216084789,0.42027049320528875,0.10791188186522915,0.7523136317317697,0.759118601350604,0.5319807304996537,0.9062841645880702,0.17317558797137933,0.5007225522811336,0.763282331110502,0.7835804753502965,0.04331347091427429,0.40824386664754364,0.034494885858759816,0.8540997533003405,0.4890122991378206,0.16310726059738168,0.15509483190794293,0.84319096072815,0.04558952593360377,0.9965436526583598,0.011013785252251496,0.07144254111843862,0.8624029240917744,0.42833020221524065,0.21528215549129293,0.589168374769438,0.21930226109970918,0.31383610523909167,0.14717010137401376,0.6062459985332506,0.4972583862739477,0.7020118941025063,0.663731667897369,0.13833784342357358,0.19810434871906923,0.9687449278503285,0.8228971001381019,0.11466363753136322,0.688289029459411,0.4990347228189671,0.33378867490090025,0.7756116226110369,0.5725917890399119,0.8486365831551336,0.18889360756672746,0.6346245252236745,0.7019469771854701,0.08809417106161987,0.9879045474123653,0.2733588868651571,0.21724513420271685,0.5510157946807381,0.3362615867031278,0.6250431994971561,0.341440719172998,0.27768638487993924,0.36746078614835564,0.44927225152409167,0.5355876314344166,0.27585193498322347,0.8125554207825538,0.10804492767486384,0.5178938130587031,0.7141228310739429,0.24014210383000767,0.38717960479943825,0.02358253906439023,0.30441257673865507,0.8547751845218734,0.17357470621622006,0.9999102883283147,0.7012570491340478,0.1127145636103688,0.16323882044120286,0.8728911362632455,0.07667817511498176,0.41406248670295587,0.08130804286906335,0.34746813114289377,0.4656982677240036,0.04747998129943465,0.1169648670579837,0.3301160017779079,0.450468203873966,0.40212223137773184,0.3544127603105631,0.2080938100021429,0.16242161632669294,0.8573300987528023,0.5314929624735396,0.5188974365992387,0.607584890140565,0.05148017290329199,0.6259491667124589,0.33202613038009576,0.35500271074237677,0.9551506376254695,0.3554355453227941,0.5655650640286541,0.3966075464636216,0.9428969004148005,0.370398658215781,0.19996846110415833,0.007007476117087852,0.797724800647845,0.06597634784090933,0.7582902515862561,0.02460120078637551,0.7641497839923235,0.36339350825080863,0.9633059847775345,0.29715249441093583,0.5855354832817418,0.19247265208201825,0.10558683154559945,0.134823715350334,0.5949573153839707,0.010968265850159864,0.3078810530024252,0.2781388301705061,0.5893453374525147,0.026784431635846984,0.37815803105418844,0.385226018737026,0.5902940072756658,0.4804822310168224,0.47794159831689065,0.10148098776741787,0.5719109540548434,0.44958487831908345,0.6053897703110497,0.7622481807459398,0.5600403484249837,0.14251446415932412,0.5178946376635324,0.9986186693322839,0.2638275868311877,0.17823703784833766,0.8125503333134754,0.8593160440074775,0.27250412648826505,0.9912226728570268,0.4164535235729385,0.3524033008174339,0.08304146777047383,0.22136532044507695,0.992768884836086,0.45129807211283646,0.31578884818107444,0.6955011177705238,0.8016078032830328,0.18413948315063255,0.23713349091505886,0.35148047630906953,0.6608176814452926,0.15975454733493544,0.9879586055747032,0.169477137816611,0.9861950504685235,0.7865350689377304,0.8928727805030781,0.5346095783284022,0.3374706625604583,0.8109048456838591,0.5181510656027997,0.48693194992207967,0.1355222954180656,0.7817096069486499,0.6972711360863102,0.554825368461604,0.3041723341599707,0.3761377624211648,0.8349042751532235,0.9122595410079782,0.8464988285767922,0.7834978066856714,0.1119592383308109,0.7158944423271311,0.8835915096738807,0.21090904237513242,0.3644824725769159,0.954952307578908,0.27433147729086926,0.42311387860579264,0.5839374890501874,0.9622424112382282,0.40377696582559863,0.863412772235646,0.013359014832326044,0.3919874833968774,0.5240432983742884,0.9550351013466553,0.8483593332983527,0.7949219047859749,0.8499212622773925,0.3728095453905319,0.4967371513187354,0.47980681696598115,0.18626738096846907,0.007001181889652708,0.980378327518847,0.6686980820097131,0.29889014619040855,0.3660883101349909,0.1348513997025591,0.35013818368350935,0.9417361904550672,0.1896084828882273,0.4728856759861777,0.07152364639667308,0.4455994095100554,0.748911873389662,0.5111374557345855,0.0685303448809208,0.7564626229820182,0.3177327077041612,0.3582897657327029,0.4823578019617458,0.9269393479263499,0.8086750653177727,0.02994958013825899,0.9184753434812031,0.4585144224468436,0.8881173983885828,0.7788655651224773,0.6091538272761821,0.9779772851545985,0.5712711848839197,0.752808757923906,0.9061533837147691,0.06446349272714713,0.6359971814292107,0.2647992691528688,0.957062897381775,0.8119635463681649,0.09566662640805002,0.1799852895112224,0.46129855492324456,0.5610085578257453,0.4067291955511948,0.9690660211745733,0.16318759435551844,0.6318864545910701,0.5455375772243558,0.048377753122600176,0.10397289950727573,0.409678088047735,0.5226026596158038,0.36180165379701545,0.4505440852612962,0.5463542233175125,0.6586145485053009,0.8392307413949064,0.8372639006174118,0.40884081531605565,0.0694799775025221,0.011068812382858395,0.7348986748936616,0.5229372874476075,0.45352041090716233,0.416648580258107,0.5776234455266018,0.9960961266086786,0.5235587805211638,0.4651318168748214,0.4949183125869756,0.04822431988368414,0.9304076163440189,0.049949109195925434,0.5901870414104561,0.9958280292938552,0.40249121745591054,0.9532605851210242,0.9782155307730594,0.2752001201885489,0.38211331602720844,0.21297553793933965,0.9157001458905315,0.9788921159715103,0.13835337723300745,0.5883578540036508,0.2848416458675612,0.5116257794621689,0.6593596903446738,0.9279159576491586,0.7984448509410057,0.7159501874590555,0.4007927867853862,0.39591836761411137,0.7068044295289319,0.940636602155526,0.9989007104189692,0.7444493900388652,0.848382413203432,0.9807820943412409,0.9643153519566257,0.9129567740122444,0.5837286272600514,0.05933111137632108,0.14538659323546388,0.5914582238217563,0.9929245311779127,0.07248175361618237,0.500665963250697,0.6452882791415001,0.23489561437935913,0.5101163374941357,0.41897023001044154,0.4676156033548937,0.11565251100931295,0.03981201935990342,0.9758203722472315,0.6865291672590947,0.6784133439525879,0.05448408564209006,0.003921267956633057,0.370434553855412,0.5474410575754608,0.3347821500277719,0.1293965921341519,0.26846643505582735,0.5177407745154582,0.4699814904236601,0.09304217864897224,0.0368117920676857,0.11555819463267125,0.18909514652772497,0.5935536822815111,0.33463703533700273,0.16741961054372523,0.9275088631914925,0.4923106128136413,0.9390237526002182,0.7806439961141965,0.4130985363584565,0.09638303341951726,0.31628232145141266,0.8676161804656003,0.574862741658959,0.8723881426853309,0.9577965034180426,0.02862678147162312,0.9645150064468897,0.23249002954356757,0.3480595874117378,0.9127179813684992,0.839007629061219,0.9221644779749641,0.025686456082582687,0.7160453330465038,0.7340993138185241,0.2540619486758856,0.02220721081000243,0.1626892409965146,0.5160044875849362,0.8673884358232541,0.7170709730750351,0.19439732963438072,0.01283465086489044,0.2881448549809468,0.9220161694045215,0.07752876029839328,0.5557863368693838,0.3391100860357873,0.7463707569505246,0.11312949867862765,0.6970773498741611,0.7401145438853424,0.4877791328890474,0.14168150525247436,0.1977625540773179,0.22793739534558988,0.411142761464909,0.9329086672238042,0.047508147996387584,0.8370300066641433,0.6707689901621261,0.09812424025187405,0.8089015786274574]]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p2523\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p2524\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p2519\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.6},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.6},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.6}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p2520\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p2521\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p2487\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"LassoSelectTool\",\"id\":\"p2511\",\"attributes\":{\"renderers\":\"auto\",\"overlay\":{\"type\":\"object\",\"name\":\"PolyAnnotation\",\"id\":\"p2512\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"xs\":[],\"ys\":[],\"editable\":true,\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}}]}},\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p2504\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p2505\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p2507\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p2506\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p2497\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p2498\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p2500\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p2499\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p2503\",\"attributes\":{\"axis\":{\"id\":\"p2497\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p2510\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p2504\"}}}]}},{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p2528\",\"attributes\":{\"width\":400,\"height\":400,\"x_range\":{\"type\":\"object\",\"name\":\"Range1d\",\"id\":\"p2538\"},\"y_range\":{\"type\":\"object\",\"name\":\"Range1d\",\"id\":\"p2540\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p2542\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p2544\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p2531\",\"attributes\":{\"text\":\"Watch Here\"}},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p2567\",\"attributes\":{\"data_source\":{\"id\":\"p2525\"},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p2568\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p2569\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p2564\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.6},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.6},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.6}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p2565\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p2566\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p2536\"},\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p2553\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p2554\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p2556\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p2555\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p2546\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p2547\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p2549\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p2548\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p2552\",\"attributes\":{\"axis\":{\"id\":\"p2546\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p2559\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p2553\"}}}]}}]}}],\"callbacks\":{\"type\":\"map\"}}};\n", " const render_items = [{\"docid\":\"a3d6bbff-1da6-4e51-945a-601fe0cd179b\",\"roots\":{\"p2572\":\"b8229f87-9d23-4640-b175-92151753177c\"},\"root_ids\":[\"p2572\"]}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " let attempts = 0;\n", " const timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " clearInterval(timer);\n", " embed_document(root);\n", " } else {\n", " attempts++;\n", " if (attempts > 100) {\n", " clearInterval(timer);\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " }\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "p2572" } }, "output_type": "display_data" } ], "source": [ "from random import random\n", "\n", "from bokeh.layouts import row\n", "from bokeh.models import ColumnDataSource, CustomJS\n", "from bokeh.plotting import figure, output_file, show\n", "\n", "\n", "x = [random() for x in range(500)]\n", "y = [random() for y in range(500)]\n", "\n", "s1 = ColumnDataSource(data=dict(x=x, y=y))\n", "p1 = figure(width=400, height=400, tools=\"lasso_select\", title=\"Select Here\")\n", "p1.circle(\"x\", \"y\", source=s1, alpha=0.6)\n", "\n", "s2 = ColumnDataSource(data=dict(x=[], y=[]))\n", "p2 = figure(\n", " width=400,\n", " height=400,\n", " x_range=(0, 1),\n", " y_range=(0, 1),\n", " tools=\"\",\n", " title=\"Watch Here\",\n", ")\n", "p2.circle(\"x\", \"y\", source=s2, alpha=0.6)\n", "\n", "s1.selected.js_on_change(\n", " \"indices\",\n", " CustomJS(\n", " args=dict(s1=s1, s2=s2),\n", " code=\"\"\"\n", " const inds = cb_obj.indices;\n", " const d1 = s1.data;\n", " const d2 = s2.data;\n", " d2['x'] = []\n", " d2['y'] = []\n", " for (let i = 0; i < inds.length; i++) {\n", " d2['x'].push(d1['x'][inds[i]])\n", " d2['y'].push(d1['y'][inds[i]])\n", " }\n", " s2.change.emit();\n", " \"\"\",\n", " ),\n", ")\n", "\n", "layout = row(p1, p2)\n", "\n", "show(layout)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### CustomJS für UI-Events\n", "\n", "Alle verfügbaren UI-Ereignisse und ihre Eigenschaften sind im Abschnitt [bokeh.events](https://docs.bokeh.org/en/latest/docs/reference/events.html) aufgeführt." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
\n" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/javascript": [ "(function(root) {\n", " function embed_document(root) {\n", " const docs_json = {\"4e97556b-5f77-4977-8ae5-b274ae044b20\":{\"version\":\"3.1.1\",\"title\":\"Bokeh Application\",\"defs\":[],\"roots\":[{\"type\":\"object\",\"name\":\"Column\",\"id\":\"p2877\",\"attributes\":{\"children\":[{\"type\":\"object\",\"name\":\"Button\",\"id\":\"p2875\",\"attributes\":{\"js_event_callbacks\":{\"type\":\"map\",\"entries\":[[\"button_click\",[{\"type\":\"object\",\"name\":\"CustomJS\",\"id\":\"p2878\",\"attributes\":{\"args\":{\"type\":\"map\",\"entries\":[[\"div\",{\"type\":\"object\",\"name\":\"Div\",\"id\":\"p2874\",\"attributes\":{\"width\":400}}]]},\"code\":\"\\ndiv.text = \\\"Button!\\\";\\n\"}}]]]}}},{\"type\":\"object\",\"name\":\"Row\",\"id\":\"p2876\",\"attributes\":{\"children\":[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p2829\",\"attributes\":{\"js_event_callbacks\":{\"type\":\"map\",\"entries\":[[\"selectiongeometry\",[{\"type\":\"object\",\"name\":\"CustomJS\",\"id\":\"p2879\",\"attributes\":{\"args\":{\"type\":\"map\",\"entries\":[[\"div\",{\"id\":\"p2874\"}]]},\"code\":\"\\ndiv.text = \\\"Selection!

\\\" + JSON.stringify(cb_obj.geometry, undefined, 2);\\n\"}}]]]},\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p2830\"},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p2831\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p2842\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p2844\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p2836\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p2871\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p2865\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p2867\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p2866\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"2PlOIsoj7z/w4BEqPmMaQNVUE80iK1BArK6GPD32T0DOD0SqZUJYQGic5bejuUlAldf5AoJTUEBVgKUPuPlKQLBmcV4nNlVAbN1GDBpkEEAFwHy6DmhWQJpVBQRSdThAd8htPQFQQECurj7poehQQHF8/iI5lj1Aa6DjlxrmTkA7d4T+JvhMQAJlM+q44VBAhramuUQ8VkB8mxxi0iERQB6KzhRHQv0/+YsNc11nREB1Tvic+mNFQHLlWQeyzDVAUzaAvOyoUkDTRsy1zsBWQAOhSfrvdC1AJnfYn2aPLkD2jAvFc01XQNyT8Z4HqlFA4Iz10+mI7z+kRVyCbmdKQBuAwUj8F1JA9LH1ePIeRECbX5arcrYoQJvIMIs6U1BAIDOqEDmIO0BOhGClJ4VYQNa7zY/8g0pA22fuNUEvTkB4HaHzBfcSQHTIJYH2kylAmx7w4JWoN0DxfHwCbZNUQAEAgcjoNUFALxxFXuebQ0D+93tw9q9LQD6AIZV/AVNAs4DSJo1aSkC3IirbXYQwQL2a1vYCV0xAIm8rktUJRUD5in23Ao4zQHWJAjYu3EtA6hp+rMY6S0Bsz+of/WROQFRCDbrl2VNA+EFM3B1VC0AglUdMGxgtQOBws8W/vyhAE+a8SvcdPUB9V2Oe+iFOQISFWCWC/ldAmJijgtwGOUAs02y0zIJQQK0Y5oHdVFRAIU3nlSjPT0Dohwxv3OvkP+NtqoFcd1NA5A8o5JuAQ0Dw2TlatYg3QJLOf8Fg61dAOFpePIoBQkCy1/urSWQ+QNruO2cHtP4/oaeGLRvHRkDYyCiVkhFQQIxGmH52TVVAC5IX0qYYRED/QtGYUd1BQCntwrbKQzVAJurAFi/OM0CWne57xPFRQNzY8yYRTFVAXKFuBNDGQECLiWmysfFWQDCuRp1M2FdAoDn7eIXmQEDEhE3uq2NSQCc785EIgFdA0lUW0uNVJkCTCEXDHrtWQIOaAVtFxk9AI5HG1x2KDkAuPLKjhqZJQBVGGS0iJVZAQIT41fBhWECe1dVbpwpQQAjkMwVPLz1ApKx/dttRM0AUPazTWEtUQChFM5xBRUdAcVtdZHyPPUC9UiqRkG1RQBWI6D3Cf0pAcch0knLbVEB+OWI0zaAkQLduafZaU0BAfCZjtYaUV0D6Gnh1xRxEQMxKCkppKDlABFMVC3UxV0D+GjK9g51NQEiND3eodUVA/hJu8G6kWECdm7vMkONTQKKFvNltbiRA2TPHHGEbREBOj/ON+vBMQMjWGKlXejtAL7yPjY4FRUD+N1YPYo9QQBgreUUDnRVA9LePMjOQVECLhqY2IehVQIXucf/DdENAG44Qm4GjVkBZhXmLGP9AQBfr5X0dS1JA5ZL5oz0JQUDmFS7osQ8mQHtcKcDyqVJAxDgwJcLqMUCgyyVVmuRXQCo8OAozP1JAZZSBMjlOVUClA5Xe61NWQFiQkMjN7lhASK85ktLWTkBt8QI3Bq9IQMBn3v/QAVJAjs+GFImkUkCMuFARaz5EQK+hiukZiVRAAS4kkdAOSkBY5+vvc09EQEYIeNEdYVZAoeuvjoSzCkDw1wBuElJJQBohhAjoQEZAFqKtfIVGV0CIWIlewUM9QPmQBjeMIklAzrpQAXhPUEAFqNFNaMJYQH6xYYDvIjpAYbUcEWnaWEADP1Bf2C5WQBLafm4l/VZAo1gnlgqKVkBHKi/fYFxMQCpcd3FW3jRAZEvMCUIVQUDBwALAKQxIQL+QvRLnxTNAv1RHZ0JySkBcIZ/Xa+EfQO+7sV2AtUxAMZ5Qg9+0SkC7m6Ahr2hPQMeh6fhd0DBAOhtDT+UuVEDbKXeDkPVIQKLJHEr9gldAsa79OYDLMUB/6EO+vSocQMjgUlxXBlJAI3tNOYKQUkDK3hemmF47QBg9Nl5jkFJAiooU8El5T0AHSFZyovFWQNKPwzIj2/I/VeXwAGaiUUDU5Dqo75c+QOkEUc1wjlVAYeSccAFiM0CZ+CwKNK1IQHhuvLIU+zJAtOxNKqsxM0DAcaOLTQ/qP5vfNmIPoVJARLX2mAQFOEDiLhzTWVRKQEDp7O0NL0hAl42rqoIYQ0Die9FUEDlPQO2dfZheeFJAHhiVAG49VkAc0LjjL1k1QKeeFhJQgUVASPOBTNIUTEAgipBRwktSQIKHwqeOwjtAFd23NpCCVEBRtjn+GX1TQM5HbFq+DFhA3yh1wHXXUUBuFqdT7zxJQFf5UrMBSiNADyCNo/DvUUAlQH9HNDRQQNF3iKRuR1NAzox5iB/DS0AT6/ZJSPNLQLoWQfxGlFJAEovMzo/3PkCzCxx8tNNXQAqtgBHLUk5AuJC1GUm3UUAgBx4USvBRQHQtXZO/SChAALmJ2R7fT0C+c6ONKd0xQLnRYGLY7UNADKUT3iDyS0CwgMl5BPhTQP9V6HNrhjxA/W3G4S9oLEBHcSPWBh1XQLEsVMnPY0BArlB+RTrtM0CvtXl4MzxRQIArBmGTRVJAwWQfQMeGUkBmKA7pv8ZJQEhFzbW72QhABJzfUM3DQkDUtSF1oooiQIydJRVSr0hAQTfUpuzKO0DknuEFUcFEQGRkCiRFckRAyBLagcjkIUD1f7D5qh5EQLq2+zunYEJAzJ7ioT5dVEBAP1LPPDvpP6UnSZz2NDxAgaaiGVXLU0AjpN/y7yE1QIBpqY5WOVBAGqTC4LFsQkBBhfykyGYiQPiNfKGsJEBAurqIK0iZRkDmkqK4Fl9OQHkjoah3k0RA46q2AJPAQ0CrJ4XodyFPQGSKKQbBOEZAcTuF9SL5QEB0AmbDr+06QAQvtwqgii5ApYmeDvrBTkDFZe/mWb9YQF5DRAwJJU9Aam8jTGdYVkC9s5VqrxRGQLd8jiH1hVRAYrDgFX5vV0CldXkviPJIQPfmZnCMlExAJr43vYTtOUDU3w7WuV1TQGeFuipXg1BAtmMc+zYsREDLanF7daZOQGzD2p8awiBAKR/F4QUqSkBjsspUvwNVQA8Eofw17VNAhTvINJPLVkCKukElzwJXQKQWXF+bfCpAArrl+DuOVUDtZpjPbARJQF1PGOMVWVZAgZjDU7N4WEAjpjI0KQ80QJyqTDWyokZAwI9FTILn8z8hbwpLeBM8QPhs4LOx9EdATZtMFqmJUUAWtii+tQRYQJ+QuY/H2UNAs2OIG8jLAEACNyBykrFOQNxrkMBaIlBAWOixMZp6I0DRolAy5o0sQPVJaYnZgkdAfQY1UVgZREC7bNNR3/lTQMJ+1IVT9DtAOT71JUw/QkB00yvOSFBGQOcRc/MV20xAsUyDkqlXVUBQi+NEoodCQHHoUknXXVVANiB5YlNeKkAmmwXt1l5TQAeTP1TujkVAVP6hXr8tU0CrZldc/PNJQD+zom32/lJAhGQ63snXWEAxWwtzH2xVQI7n40FCDVFAo7kLeRCYVkAxbvDCvxI8QOl0VqULzVFA4rHxcjIONkBrZBhgfzQsQGkCYsKWMEpAxn/07kaZGUAWvu4hRyshQNgEOS4WGzFAyqrfhSZJSkCsZoUbaJokQHyV1s3kXVFAVE0wTBKxRkBszEc82KcyQCOqczHMRDlAYUwtAFEbMUDqHr7YfZVBQOPjape+TzdAYlqy7Wr3UkCOvQ4DZ0tSQJJRBnz+uR1Afa+JPED+VkB9RlGOuHlUQBoyZs3GAANANPJgh8wZVkCyX3w/IdMzQH2RfCNe8lNAVACP+B2aKkAKG077OIM4QOox1rkKSFNAZud+QLQyVkDXKMNK+g9VQPC389+cVVFA11VLpViwUUAUJ3jj0ntRQIwdoDRGVTVA1OrunIXqUUBsymIA4GNUQFOw24drtFJA7OYu+CtqJ0Cg7DqCHAE0QOHJlYozTTFALMrilL1/UkAh9vHMAAE5QOHid/X5qDBAyivP/QkGSUA6+XFHUO4mQC7r6bLDgDZA3u7/xSnhR0CVlnzcqDZRQA2gjuMPcT9AXX19kS/1QEDldKc8e39XQMFYq6GjkE9AAu9EuKMQQ0AgEXF/79o2QCAuSOnMGx9AKVERZJF/WECQZh3Y6HJCQOGZNRLLhzdAMFUIP85MR0C4g/TjBkJDQAJCGRVRkxpAz6zNq+ltVUDjwVzxrz5XQE+bLtVw8FFACkcGoIjvR0Br4cjOqrBNQKiXHa6CglhA2Xoh3LHVWECtB1hAQgROQHQehNBghBVAEtWwm8qkNUAIdHLOQgssQGRZdB2M7BtA7F3lztVUPEDsdjGfj+YwQCIeJex5LzFAeRtwwSoxN0DopUnBkHZMQOze15oQ7DhAj4fvov5dSEAxkHmiiYEiQDRvTRwV6FNAiuvNClOXUUA96Myr8wVDQOTDOpY8HUFArGbBjYm/VkCj+K8wl4FYQIN0mnvhdjFAkq01Ck9jRUCQRo34Z2pWQJVaxyoWO1ZAFBpuLBE1O0AulPxPML8cQGQof4IcaEZA0pyqTF+aGEBEm5qTl6lXQILPStGYBkNASpSMoDt2T0D8YPHM83IRQNLImVfDbFdAwqr9pciVE0DNx0YrdThVQDkOxiKqajRAMu/tfwGQVUAlZSzRn/QxQKQ2Z0CrHiBA7ziZS978OEAN2k2mG3c7QBZ13JhHyDFAeqz9VimFMEBF+zyVu7dBQFOZjynv+TxA5LpVo31hQEB8cL4abeT6PwT1K8tpfSdA9F6YsopGTUBG9xybw2gyQBnXb/Lc/FFAnSrfP8HPUUAyItPnBTUxQNPk5Vk6HFZAA4dZh/rcSUCSlXmH+xZTQF1iZJZizFFA7jJQST6pLEBrrYPtpLYQQPwR1En8AURAa6CdiWoAJ0ATwEAvLo5AQA+JIz4yFFBAmzGPMjkiTkBPU1GHv31UQILxnsFao1JACnsCvZ/SNkBunVzjnio6QCIGlHUFH1ZARTewZ2UoGkC3DDTL4gIiQGsDqOR4IVJAqag7ZHoJUkBoWk7FaCwsQM4UTzy+cEFAluvvLefROUCTJaTxlv1UQFi5Oou9bzdAsKjzrV/pR0AtcpkcnLwFQITN+QzerFZA1cJifablU0AAtoPWY84wQBzaEhpi+EBAAEvB2aWWTED5U4TcQT0+QGb2IJ8tBkNAE+8GiCiQS0DiMBcLcadRQJEBLINCDEtAUNza3ylWVUD5JN+y15NNQFttI5R7G1hAnGrhin8WQUAalYeVT2JHQO2C/2EszDNAzJfhk4CgIEBzVeAaksYaQBqnW0OxNVNA2xwga8auRECoMc0HTIFLQIkaiNHQCkNAZWZGs1p7UEByuGk2KZxVQNbhm5BzVFNABKPt6rlIUkAN+PIaHtRHQDL+zRzvoUZA3sVJ0lKRV0AkoLkI210sQFQjQ+v9lURAjubrve4TQ0CgwsrrhI5YQBQ1HtFWtUBAOH1b4Wau8T9S0ouHWE9SQMpG2nw6YEVAgvd7U7b3WEBlgWlSKhoqQEE8v4yEIjpAXxtowDRKVkBWFN68hKhAQPTCGQQIW/g/TLCWHe6gUUBr6vXVUZ5GQIb2jp1j1i9AudCcUcXYUkASOjqcQQJRQOjrd5YmSVhA7Y6b+0mOUEDbvJqI3XhSQFOKMfF5IEhALu3dEkr8U0B4QRPNL71EQPlCJ801LEtAEOpBSkE5UEBN9vuq7L9UQF1/ZHY570FASmc/Ka54TkBw5Q+ocRQxQIRXBA7zUFFAIhhR6B1xOkCdfgPgBxBXQAX7zsSR9ElAYASqA2BnLUCv40ehiZNVQCQzrfzbED5AFyZIPGxOVEAEkJ1CAApWQARM+S2VIx5AJP5ltXpkVkAECscNFPMXQOI7rJVjPDNAdLWpMviyVEDLRtmC9+0+QPCApcF3vhlAEJRN9TE4Q0Cz14uCQ+tPQE/rVdxbc1ZAwyWiRf3YREBf9XLzdDhUQHyiv0uiy0BAFOphEoj8VkBPYWY1imVRQEsKHA0Lk1RAOc38GALFMUAujN2B6wE9QPiExRkrIDNAUZ9K7hAoT0ArYwYmAZpYQCo0QNu8vx1AoJhcCeU2UEDgg+T+8sBRQC18gi/szE5AB/Doe0j6WECwboTejm1GQEv6OcJcoFZAT+kGnAFhREDL/Wl+k1hYQEqd+Wr++xVAPoNni7wATkA/L40Z/r5SQHJoWul890RA1Xx/b7qZVUBhhSl6tHFMQPdeuxcUUDJAMp4Mm63JWEBU5aDFuBlTQPWc6Fy8ZUtAQVR3IFPqMkD51Wise9pRQAj3NfxEykpAHm2oecjjVkAdKPBon75LQOBJLg/++zZA2B+1yuXLUEB/Itu8yb5DQEPeEIjBnlJAlvIahbG1NEBpfRP7vaVCQMIv7oD1ITFAvVsaRWFIVECUxKnSi0NLQHwSYax2FCRATWvgv3dxVEBLhUPdiWlDQBrRXIOXVUpAN+xFslOjR0AgYofRvI0qQDvLsnmSBkZAu0l9chZXV0Bj5lqzYg5MQB+SUe0MdldA1ohUd/ebVkBLknd9kjREQHlrqGbphi9A4frwdWE5WEDpgONZt9tSQEMfpTPycUxA8sDbrEy9OEA2KIXqsAQNQLtOdvcwLUtAGwJNNNeHN0D5IgwHeWdRQDz+3pljaFNAqkKRP5RpUEDAS80m7h1VQAmq7EARyTtA5vwttZfHOUAK2DTgDFFRQLoMXExDighAcsDKi91pWECkuoAgK51BQJLaCdeFjFhATXrCd1QPUEDy33n3xDsrQJbzhb0if0hA+IACKTx+FED6rsREhvAyQB1761HuP1BAkxcIleXkK0BqH55fXh9LQNs72calX1FAydpPU7zqMEDQXLnx2Gw9QO6j5nHOr1BAG49VL2xjVUAzQu5TpJFNQNjzWX7OAVhA7yfXi29TLUB58IOuisZBQLTkGTArjVFALFIn0uf4UkD/GfAf2UNUQHErAKKJrlJAeTeHbBt3SEBUpGjIg6kaQA5eEvZU1E1AkQ2MBzEfO0BWzB5xaWlWQGUxyeiHc1BAkElMTpEDLkCrI+hBnKBWQM81MPmUWVZA6x8AGeihS0AeuZ+GLyP0P8zQZp/FH1BAYEGEqLkyVUAzS967xMlMQApzzxz+VPY/7NOBZIOESECXHQjdMDBYQAVAEFiwSTFAcWWujU4NUkAs3XDCVJ8AQP2YT2O0w0tA7lw7wRovDkAVZ8flz1NYQFDADsbeRkhA6ptSdxmTTkD9oXATJ3NKQP6Yk9qWFDxA2uyhyM7GWEC0ZSheLolLQDaX5+sEa1FABMcinU19WEA1i/pX+P9HQCAMT2TQ5U1AXlkx6OXKSECj/mprucc1QD4onEeItzVAeTzvSe4xOkCCSl2Yl7hIQN7ljy6xNUlAgvlbiyj+BkAkUKJv0UYvQGvlRrGLnEhATDdrDdjqA0BAvJrorVdIQJkpKS+nHE9A+gI+uWW5RECpxvWwpBo6QNB+Xg+XZEdArfoyBh3QIkDfAtFGmHZEQCHBrTP47FdAZwT/LEugNkAV1wmFFXFJQM9GByZq4kdAbimPJ4H0RkDU2hk6QMkYQNWl2+nbFVZAuP7kZn8kL0CjcGAhcYMwQOpOtORsI1dAWAWuzhgRVkBdrfDkQ9MnQB0/6TFY0xtA6t8roo+2WEDIIcBOPDhTQOpsCPEkdkJAGQ7MRptrSkABZOaKMaVLQJyL/BuJUklA0Pg8hQnLTkCINOLmqqxXQI6Ll0iRuTtA+92dbDxuUEBaOMedbXpEQIUciPjwqlRAILlXEtJMRkCsYTbL7kUbQHGQe9Z1HDRAMAPeOyygPkDbFm8tY8RCQAH2cpexFlVAdZxcnim8VECPOxYOr0ZUQAJCJbGFqDFAVGvhmF60VkAzdtJd06EVQG69mZaCiv4/yOiYE5qmVEBf374SGkM1QCAZXl7psFRAW0REmmciSkAVcAw6YVpVQMiVSXTYWFBA2VXqXtssPkCBz/UvtJlNQA5ndtbuxz5AEFtkrnlR1j+QQf2TrQ9HQDhK/wBgk0tABvuY1JAYNUCmMuQ3Ytv4Pz/DJGRWmStA2LFQ8xjvUUADyzj5x0hQQJMp5acXXyhAXMH4aX93S0CIqYnNEYkqQHx6XGZppzlAYxwLp/3vU0DQ1LvOAJRWQJODmVi8CElAhgHj3xbFWEBpxEOOHQxIQOnAjVnPW0ZAJJkFVXQ5J0DLOaEUrQJMQBo63EZVZkZAHuZfRrzDQEDz0YyzQrs0QJXpP0DSB1BAHitdtHcDR0AuhPN08b8rQHnNUtQ/llNAO5qjQIZqSEDbCbbFYx9AQCrjapgCoklA2yR9HaAOTEChnfiOypNBQOu018QswzBAneJumRtnUkDESrwlomNYQD8XDKhz7DtACYVKGrVVQkA4UBLT5h1CQI9xehkQs0pADDA695yMKEAaVpri+TVOQPXvZNTHFEhAigADNzQiREBia/S+q9lDQL5y0riGSFFASFznKr75WEDSPEhHnctWQN138DP9zyJA5Sm7a1FfWEDMl/rWNJk7QPtmCi1tkjhAlS1ym4RTUUBaIjMkXfg6QPZtoAG2zwRAnv1DL+ruVkC9ErZmZ4pUQMTP1xpS1/g/bLZn5BZBSUBOeFlD1tlXQOlGne/PLVZAiBXdi85CUEAVRrD+32UoQNDm/2hWGjRABcvU9Fa1TUDqQcy7Um82QM0iih7H0UBAHfTmnlH0VUDdqTFepotIQALUTU5LEUNAaZ8+KXi3UUDjP6n+NzVLQPXS04Sr41ZA747xqkYPT0DA4BuegPQ3QK5Nlh+O7UFAVMtrW/xPCED+0kCoMSxNQLmqhlat+zJAs1bIVWOnVUAirXniOdcnQP2RFeKRUlhAoqacvd3qWEByP8QW7xRJQNYr5QTuUFdADAUybTEhE0CLSpI2YbRIQBLE80j9B1FAUZnmyNhHVEB3T2lcr0ZTQEjiEZYjt1BAGjdV8a/wN0BSXEZ4D+tQQO7Mgao5s1NAYVoTk89fV0DdrTiW7z1EQM7c7VJz4iRA808twHyxV0Ccqtt9TeVRQHSVuBsVvk9AoJPBhi7WVUB1fmpADEhXQDqsO/3Nw0BAsFhl1g6qUEDwqChRjDMpQLU9ZutaCk1AF69PJAo0SUD0ecOpnjtNQBD8ZdnjQz9AbEgwMB0iVUA14APaY1hRQNDIFC84dTFAudQ+pO2cVkDKyIvL1npGQAu+qjJeDVBAZIzjYHzx9j9Yp9w2z49BQPXT2g/slU5AGnHCnP6YSEBJNcr6Oy4iQF4A6Fp2mVJAt1j63z6UWEA+HF8N+01HQJXwP0pFnU9AIiSr6gCeVECTrihofNJIQIpzre8QhTRATGWQws5wMkANbWK1uFdPQBGX8/rWJA1AuBv+L3aHU0BK2UUTq6NEQO1uckXunExA4MK9hO1cP0BgGtbDhUNPQPxfRl0GT1JAEhEf48DMQUDuZQWshURHQEID3U0stU9AVxpJ8BP3O0BdSoQPGURDQLje+Qli9E9APiZgFgcHU0AMYhNcPJJWQA/fTcg26SJA3bvXZoU8N0A4qFoO93wzQDK/4PBSIy5AtwUH6aWSTUAl/dcpqMBBQLKUvT/GgyJAQfRVul/GRUD63n22lnNDQDQjK3EoP0RApNmtVeeQR0BPTZOrlGNSQKagrlqnng5AzeW/q730U0DpLmimuoIyQKcFyif8X0NAmOx4jCxdLEB052mTO/RSQEEC40O09FBA5JLwqvvOVkA94XVNHY0lQD21f1wOAFdAKYf3lfegTUAeSDkUjmUwQCLBevgvNjhA8tBucaEZP0AaKq3l3v07QP10fiMzBA5A6SnKh0D6M0BVbOj9zkhCQIh3GBAIoVBAEjyFmcnwTkDMr5IbU9kfQMZ3oprr2ylAl1C3cKtDU0BP5zW5nRRPQJwzkXGdjFRAtbZklikFL0Dcon7qwiRAQIDoGyQoDz9ARE0Gn52D9j8AUcnTyvs8QKfsi8KHElBAr0JnLNmmQkBjURp5K2cqQGRKg8C3N1JAIoFftjorK0Bq68UZdxVBQLjYgYyBMiBAQ4beseW5U0BHUL7VDYBUQK7n/i6DclhAfYxqyeG4U0BSJNISSuY0QNxfJAg2C0FAIPb9jALkG0Cq14mDkalQQM4Y3Cb4Wk1AhRtNwP4fWEAq9e0TukxYQMr4eOLD3lRA5x4NAQrrN0DZLaOAGiJPQJiQOSZcYT9AXhxIz3qESkCTvE0Y/ZRBQI+8MmEbqVFA+/DZ/gMNV0A5LSVubJ9UQDwkOwTR+kdAm8DGbmzcSkB9k5WEpAdVQJ10TgB44VJAqPAEeQkLO0C4clxeFIAeQLN4+2T57FVAqByQ2dKPU0AmzOPM8VJLQHuJqAFiJ1BAJDwaJQbiHUAVbiAdXpdDQMUs4pmI0UpAfHaA4O3bQkDgmzLhpV7bP7bZuGLuVD5AVBgnPJkdUEAIglWY43EgQKe4UIAZLkBAoQuQjgfzTkCYD6A+sKs/QPiC9NWjXDpAFm2hMy1DVEDfM0jl4XJVQKlL5Zvj+EpAhp3dZ3C2P0Az6KOz8vRYQFI7k9gwV1NANzT6kMymNEC/fZPEZjdJQFV0QnEEZk5AD7SdXBoyN0CAb0D9rsdSQJmIF3IwpAZAeoTIw0xlT0BIf362d5FUQEA7aDDKQUBA5i7FOgInRUDREUQM2xRPQIQCeV1BAeA/ZOt/Tqd36D/Uqr3tGNBMQKJpGCplQVRA6AN1ZTiXNECX8wz7gAVOQFgggN6nX0dA7ES4CtfoOEBOsQHCunktQAIh6gT6RjJAYtMTcgruQ0BHZkMztVNTQCUmtCZtSklAs/W21bCZVUCaz3/mzjtIQJyBA8l6sEpAdAY5vixTT0CWwIQG3c9GQJpbuatwjUFA4DHm5O4sRkDTNhLVFPdVQEjcIaCqAE1A+hiHIzegWEDhAbiSlPlIQLuLKPfjJktARIFeOkt3VUCfOreY4ohJQKifOX+uU0RAK07y5O5HS0AE33KjwbxHQHaL+V+ZezhATBS/2vHDUEAmn6wYY/FTQDcwCkbFiTpAsgE2jSBXOECq6CP9k7NUQORuAwj9IVdA7DjEx0BGLEBJ1xFJCXRAQGDBhLbHklhAEHTUqaUpEEA9vEtyDPNYQNvZS64EXlJAyF86MlpGVEBKp+n7UxUYQJMPxt45ZzJAKQoK8U24RkAHbSoT92dCQH1q0bmI2y9ANSAgXt16VEDxs8LEYKtYQE7oo9ozsPE/+afCaP3tWEDUYozOzdA0QFyqYcLKB1dA1FCXkyn5QUDPPNseWIxDQD8eOSjdajBAtCjpH+RvUkDE8Dvx1BQsQAzrhj6kPxxA9BxXQpBoWECUCtOIp9RTQCySP2SddFVACRfvP8BkOUBMQ7wJSJ8RQCOMYI4svEVA8v4xe6jiSUDuC5ML3pVDQPr09I+S/kJAqGNpiA//MECGBP4RLnomQEqaWB7AcVJAgD1tS5hZpT/itwFiZahEQPv6XLbQT0VAgS6tuGb6T0Bs8kohnhdUQG5JFoZ6ulRAKQIhZJorQUDP5/wK5o9VQG/Q5yuztU5AVkz62ALpRkCmFH7/ywI9QIWE6ClleCZAII/JIR9rtz9USCg662BHQG+cCitLNTFAvHLZcrujQECcs1pbT9NWQIcJjtOYtE1AWaegy93KSEBkSVTlawI3QBV4BzYifDFAXeQ590vxWEBhOGXlSRpKQKyU2+bcU1NAxWow3x4AUECPfJXxaf9IQF/OLk98lkNAHBP8tVpQU0Ae5DGcZoY4QPA9zfTyYdo/+eQDYqOeVkBPA8o5lXtYQGVgElU0VThAcZj/tdZIPkDKrFB+CCFJQAzXzf/DEVdA6jK2/iuMUUAJEEzfi7U3QABRCzWLdE5AGQAX75EXU0BX04IyxW09QPfN0k7Z0jZAMyI1CutBV0AJoRij3uMjQC14IoMt11ZAsP6GPmtqKkDfSk2C7ssvQFjfaHLfvuI/VAVRYfVXPUCK+OHmtJxQQELS3olZJlBA1eE647gnVECQbMOR8rk2QFdyIjdn0UpAfZvL5vNxWEDcJVn5fDFUQMu7VhTzr1NAwb8+YqUPOUDEvgCMhNA3QDxRInuD7TxAAPXhbzSeUUCaDClCZyM5QAydRxH1vkdAmswqiFouRUCO4GfS/DZXQJEz23vZtkNAxXoDAb+RVkDet5vdDipWQErEzyxo0ilAqM1cfgd0R0Ce+n7lGmBRQFmmhbmO9k5AeJJFLLuERECky0n+ArE3QCqAIIvYIiZANpFBq4SCVUCmq3Xj0h1UQK2SEabcTFNAZhgEdEXyU0A4NEtnhpE3QAgBatSIL1JAmn0x7hR8LkDNT7GuahdAQOvC3oIPIE5Ak5jIX3NYMECuK7b9khhFQAcUrYaqVkRALDeQ6l4kFUBoejJRqftFQJaJGLMbIv0/qP+A7Y2gGEDMZUasMp0zQGguXydszUVAlxsWzPeiUUDFoLMZum1VQJ+84Zq8YlVAb+Dy8TgVVECQ+ZU87LM4QLfc/MUdRCBAPaImfc4IVUBwS9mqJmFOQEE0xDqUTlVAtoWKdGLVK0CPVL4cQ8pWQM6/cmAq2SBA6dTi9zyoNUDuNBMM8ShUQEAcT7yFtEVAOOs4TanLVECWJWN9SY9FQIfdf383qFNAJH8nXGc3I0C0YQHjkOI0QJR4LG4yflJAfYkcUEfKUUDidTAoxOBSQP5qNnafjVBAGyekmFQ6SUBsptClMWdRQIRQuMsfGk5AMEKoPcBYPUA52rdHepREQGxR34oKNVFAjGrFJlRUUkAxDJWpHJ5HQLf5KbGzP1ZAmg1He6+uT0CIXjFhcsJMQA1amDq7TVhAgfmZJNClTUBUsIV5rkdIQB86h9znADBAssFCsdnNJ0AYfgSZp+dQQMQt4xt5h0xAMyhPy+yKV0C4rh5nVSJOQAr+vcXlOjBA4CBVdZXlVkCPQhhKGntVQPaTvGZPlExALKLmk+u6SUCvRLaMKF5UQOK5Nm8/MlJAsjxEaLtJWEAj4ltGLeM2QEP2MMuUbjdAWxrxpRnfJEBTidmrwepHQAwMQe2Bt1VAV9mAfIl6I0A5xd8Q1udPQD4NiX+TFklAZW4Bfw5iVUA82Yp/gIkHQN0aJYn14lhACxZc5gwhQEA5cM0zb1VPQABP82r1wDZAdtNd3+/GWECIAo9LRUZFQHQAx7CzfFRAoUVXcy85SkAglctMBhZIQMT2k3lft0pAi5VfUoyxWEDkrKw29NNVQCa2gCia5UVAv10zdNOgS0CJvVTlyqZQQLlP6rQvOkRADi/q/1AjTkB/toCevzVSQJAi50NH9ydA0AWOnzoIQkCvO62B2FRVQGKtfi9M1VZAt+az99gVV0BpY8adtCJOQF3ZqWtZRDhA/t2p2dcGK0AMvV3jf74vQF/SGnQEy1BAYBKCHYlj9T/PLMkvY9dXQARI8Pq+4VVAcnJVTq69Q0BUxXa/7HVYQDI0ePf++09AwbPIyikVOEBpMy1RZllCQH0fZ06yfEZAOKWhsil0MUBc2x8s4OrvP029HfC9EUBABweC+TH/SkAVdRmh1E5OQLm5Xohk80dAneVTHK8KQ0BQRK9ioKtYQPbd23FPr1FAYIprX5qBR0CRci+uMntIQC9Ek/cxwFNAKPEIamawOUBpbq0OqrZSQA0B8Jp2r1VAHjpZx9BlUkCdNKhtEDMxQISHKr/1AEpAa+ibvyqVOkC6opqYhyJRQGvR6ckCTDRAJuEMHX02VkBWCbuunF1OQNXZil+HwRhA8ZCZTB46UECIzoJLXRpNQOfUwzzx2FJAeJEidMVsTEAg8dS1zSLuP4fjpYeBeFZAWBo8cWIMLEARoAJtZIBEQDR5Wia0TBxAEnSNaEyMNUDIVUbv5tVQQG4nhRMbVRtAjN9YyeKaU0DMJ2IMouRTQAjWKV6FAURA5ryhrajZTUBzrq2oSQNLQC7/2mYmEUdAmlZiSGt9S0DewNmfi4pSQMDb7CuAMldA0UHcyp3GUkAqPENqvDAaQJKW9F8tLVFAtbIFLyubVUAlzfqtGXJAQPcuQcRdCSJADBxt0rdkTUCMaOnW4UxWQH/zz8JbD1dAT2ppS56AUEBmVNp0gCU7QBx+X9mNAlZARXI6bSWWNkAwtA/551xJQBcQHbnsoFRAGUPV6VD+UUAqowKSeXVKQEqNoaNctjBAThBbeF7LSkCr6F87EYRUQCVuv0eosFNAzw2zgADGVkAmOfuijzosQDjgdN4vgi9ABk9HP9ZmV0COTkK26jc9QBSYodPzOB1AxALzQtwdU0Cj/HoKUQhDQBeQTkKvBERAeSf3SgTZDEDOsSCGCEhAQNLuzEKUSBhAW7FEXYY0M0CVcj5gV3hWQFbdXokkYFRA2JKuNpqKV0DGrq0P2FNOQEOJNNMTVUpAmlGLr5naR0Ac+dqkTS5VQH13LHp5VFRAFUaEM1QWV0DOkI3RevRXQPJxMI91DDVAHeQzTj5xUkDak4b5n2shQARJBTzC4SpAfu1eOOs8MEAKk2ia5ZNTQPLu8nZEXk1AhGk6Mj5wUkBjyYTl2pAlQCCFGWLlzCFAEKrWpArmwD/M5noGpwJCQLoINNJSK01A/LBRsKUhS0DBXkTudD9YQJY6EMwRX0ZA5tD6Gdo5VEA/HQy+UcVRQMZE6h8te0NAamrMlKBiUECwqjqOMW4OQGACx+OSBTlAhqj1uu6fT0BYXJajT1b2PyLw6c4A5VdAMIdykrK7IUD6WxjwjmFWQOaacoQW50BA22CGDDvGP0ByJgezQ1NCQDqiETPeHlNADha6uuNBOUAunPqPV5tVQKabQk4UbUVAnK1dgDdFWECt9ajRf6RQQG4NV5AZQlVAZWttbK9KUEAmJ+roMhJGQHQsPawLOFRAsuFg6UWuPUAR7/x3q7oxQP0ta0hwmlhAW40Ba2G1UUD4zSPtDlhYQNuV29eIWCdAZ6N58XMMHkCUBLNrpJs1QDCAdVvIKTtAFfqALSW9RkBUbJwmjcRUQBvLDsflkgtAstOtQioMWEAc4b4MDnZSQLvn/h9V8CpAPvrNv49kVEAcilL2R71TQLBGYGaotUBAxo2EKqsDV0Aqx/RMsgxTQHuWitnaulVAqjL/XApAN0AM+2eZsUFSQCfc7K97xVRAVXYytzxWQ0DGpsGM+6s0QH0HxJkIZFRARf/7vqNAQkCCuljpDyU6QOTnktbqS1dABe4HFKe2OUAYyZeZRN82QBhjNDRKZFJA/KstzJ02UkBf5avDEvtTQBG+P9Dx70lA/pBVvHXTMUB95AhjHOdWQKLwEPHn7EFAOW7epkIDVkD6ODgur+4fQPu8PfUmvE9ATApse1vFV0AS8Rom/ptVQHJLS/i0clVApMFNxek8SkB7nfo3hDdQQP9nNdgBQVNAAzgmGmOJUUCxcghBaVhUQORMJE0b7kJATxncr26CVUC7iHnJKklXQFLCkKkufStAIDGGthYhRkCjBjBCQI9QQG/Xefg9aztAbzswHVx5R0BFLhbuEmRAQIBXTZvib1VAtlqrWEesR0CKV3AwxSRKQJgy4NK9yTdAQRIk3z/rQEBU8h7Kn9MxQOLDut838TZAbZ1djyzjSkAUfD00cFY1QOnV35zZ1BBAf+kjIIHvU0BwzbbKZdjrP30TRPzLRlZAYkm2RsJsV0AVPGXbUZ8oQGuqulwgnVFA0lupmqVdUkBlEB5AZzlNQF68z4zBu1hAgUvrjo9eU0BCv0JDr9pVQH3r+GSZC1JA0XPQ91pzVkA6TyeDHCFOQKRM3hNbaElALhV65pmhKEB899iaV5M9QAMzD+lrB1NAlSIhhk7yUkAWq4RssQ5WQKg646n6CStAfLjD151DUkDvmrBeolpWQN35fMCGUDNAHnb+AeNWUUAiSrKPidJIQPYB5Nir6kRAenVuUBLWT0DohsJlTo8UQFTM84IlgVVAcYgVn9InVkA5Ryym2rJUQLv4A2vezFhAmrhpdm8SVUBgWYlO8mBEQPo1C+fjf1ZAhnTtO29++z+dTg9vXDFSQBTNSl+2KVJAT+fa13sJR0AvibAwmzBAQBWCNsawalJAxks1VyuKQ0CsIl5BEPozQLIJmPmPehtATddRZNPlR0BcYE0SsmBXQKc9o66J3VRAYNZTcANgLEDlpy8dqzZAQORB2txbAlRAdO1ntft8T0C4Wq1K7WBUQI4h8Gap4k1AldaNY4vyIEDuOj0hKGU7QKdGENjRL1hAl3gCl1AaVUC+nmoArd5MQLBGEU4WrhBA1siKt1uHVkDki0c7TIfmP3fje5NDD1hAKZpyFcoaEUDgXkV7R7cuQJ6KxBoUyT1AGjEUl1HKV0A51OeVcg9XQJdf9/k6YkxATnNi2B8cQEDne1aoN/NFQOq/eQzhxSdA8h8kUNstP0AgsBpU4LM7QBEeNK5LfkxANDxTXWnITEBYTsOsTEhNQEjvMjvJ9RBAXqbeudi/CkD/YBysgBpLQJaOgrFP6h5ArZ2Nlh6DRUAaCoQJLAs/QCXdl4WH9RxAYE7C9cjkVEBIug9NNQ8pQNPfy75x2FNAbfqlImeXS0BiqBoEWzpPQFRGOGuIoFFAfqa8mYIPS0BjFzi5hJ9DQP7vg5Ci4FZALtRuap4CTEAAqyPgcx1BQNIRjTH47SJAzY1DS26rVkBVadlUblRVQASQaV7llFhAEJ8T39TUSkDHMm7ftLJAQHAY1LQlr1NAuTB+l7KpLEA65ryK1tRQQDrwwrjJMFNAOikbBfePVECdfZZ02qNIQKok6PfIDk1AtJhZCUdPV0AZxmIYY4hHQI+5q8bVYFNAza9Lg0KKQ0AsttUxo6onQO1sq+dDGDdA78Ekz6vXQ0AcNkMbWyNCQPBzgwH8OT5AdMD18YAbV0CI9sTx7M82QHMWR2txN0VA+WL0Cq5iNEByILv9vlk3QL5KFZUKQSZAEg+gd/gOOUB2/2jnwdD1P8rF2DaXHglAVr5RUizGVUChrXi5ZktVQBl1wdbgf1FAYoL3AgV5REAZB9G/NScFQIkGbxdqJSpAVB+dCX07N0AG0z7BMAxAQH3fgLeNwElAhCo6RKzkUUBe5/uJTu9VQPZ814hOlBJAdzQXeK0wV0AoTaSAqdZSQBxVV00a+EpAp+YsANqFIkD8RQLivhjmPzSIbEaYXEpAkOxktfK4S0BZF1pBUNtVQOS+co2f+1VA/dkIGjJWLkA5RmeRLRtXQNAH9NFgXVdAZ5GbB2uwVECdEcxOkehYQK5LehdnGVRA2p3Kjj+nKUBNRDjVpUEPQPW7xbR0WBtAksqxqnGpUED0UAiCfdFYQAS2TCdzz0dAVbl+rQzaVkB1brIwIs1IQBO8eVbW8EpAak+0SPs4P0CdX2MvXRdKQKG3Fp601EZAisP9OR1MG0C8Etwq8jdSQCqn64gxMUVA29u4fDR4SEDjPNtHzY03QBk+QlmRhUJAx0D0MadQLEDGLtgT8x5YQNgrRyT3EiNA46rD6NVVQEDPG1+P5XNCQFsHHVYA2ztAQETmMddVEUAqmsK/1CNRQI1IN6dAmEFAsW+xHERTJEDryItp4gZTQBcwDPvsek1Atna9guZ7TEAI1hWxD8E5QDOwNiBav1VAvRfDQfQMQUCEDc8bOxdQQLjDmAx3SUFAUV9UBXfmUkA5EeEa6plOQAYIwJWT7/0/D//S/2aPPkCICqTJ01dOQE8XubA3VERAVi1ztUK6QkCAOR8/BektQBgRLNI9d1NAbthbkzZ+Q0Ap81XxLz5IQCg+a/wvZ0RAn1T7VMgGJkD7tqp+IlVWQBLHSse+0D5AhQOvAx0VTUDv5EczCO1WQF5Qy2sSTENAjs/q0bNoTEAQes/7w1pYQKoeg2Ig0TZAi8Naik8UTkASZVQjMMRQQNAy2NwrzBNAoGW1sx8KKkAeBpQ9pE5UQNBSUuoVGVRA+fEKUoKmWEDjY6riPGQyQEajGnhctUhAng9i7WgRS0CYo89UqDRYQNTBcLCV4hNAra1F8/jAM0DSwHl3E8EdQBFswkethktAUDEN2/eQRUDioc0kLS9NQGq75K+TLThA1tI1PmuyR0COZxlT3L1CQKs46GSQN0pAoz15oNQQVUBdvqDb0oNSQM56n7hwzi1A6iw6JskzVkDXKigXe9ZVQGRokROlXUZAxyqra+/tVkALx0yfFx9QQBIEGsUvQAhAPQkSQ754SEBLepaMsI5MQFt19Fs5IkhADFgRTTJJV0Dkle1Ys+1YQDtxP3rhaVBAutQ8H9LhV0D2EnLPZiRVQMDbBDdkABRAoTzC0DTiR0CMxm2hFANLQIav05X091FALPWqIO5AL0C6GyzR3QAxQDfagcUXQi9A4cGWJ0CaVkCC8dWEMIU6QIYA+gyHUUNAYDTAupYrREAVD4nxbpxFQAw1iHmtlRpAtoFbLdzwTkCfJUr3/7tJQLqzH60DDlNAntYTsPiNU0BDHTmldKcjQE+RhwewfVNA2eMqZGScU0CenTtmySlGQFZkEk0BikRAW9YdkGP2TUCL7M6a3nstQN73XTWRw1JAnNyim9IuQ0DVZ3vERMtSQEShjcvxIA1ANwVTwo0hR0AZztEbHhJBQJxfJpD9kldAXPhOwkc2N0Affg8hz8VUQM3wU6CKJVdAtM4Ja7wTQkAyshjm9zoeQNTR2RL99UxAjxypxn3iSUDsj9mB5S9OQEvaGrs4MSRAKpLP4vOuSkBbY3nw0DdQQCrEIm55cfg/cp7TN8RST0Bbb11jCKdWQL0Xs973yFZALPF0/Kae4j8wxOlQDgEXQN7Fa9/idSZAeKbgsEQFQkDju10uaD4wQG68lpgF+1VAv0oMagDuUkD6vSxUE9A7QLMO5AbMoz5A2RbndnMjVkBl7UJ6CDJJQDZzTsIHrUJAYASFd4VOUkAYuxILGAcpQPzHZwFnClZAMA26meW4U0BbnGFDgbBMQHQD1KrBKvg/BET8wbI8V0CJDcAzPOJSQH6OPNys31JAm4GtIp/sU0BfTYEfHnVFQHLjtkkeSQVAeyCnRaHPCkBQkg1t829YQEvRMWFOF01AvXKQqQq3PkCQ8qgDuvlRQFxvOeRXnihAKPYt10hgU0DO0SB47907QIVJsdWmuVJAhWq5Xi0aQUBQTR9MGXpMQAnlemo/gk1AYTcMLGCHU0Ci6tjMNrBMQBYfIv/fNydAe+5zaaIDV0AT+PwZ5XdSQHbX5bg9x1VAyBG/tLH7UUDJwiV5XV1UQMyAownKYFhA2ippYE3VUUBx4YyqR5JTQOmScAUjiVFABnw63RCqNkAX74Us+KhPQBi3kVmpNzFAHLJOWJYIU0BGarJzMA9VQPT2Ne5OC01A2OypGaAJUED8M12r8ypVQO8nc2tLqE5Ajx7N98jZTkCT2liWKMVRQIR/Rbo0YRhAVVPylodJUUAktidQ/3JKQPVREGSwnEdAqoM2dhKCSkBYL0n3wqBTQIGGXl7SZjRA/hkX/+cXIkCleOnib09QQCZj/gnMiyhAK1r3R+uJQ0D4SfNS91ctQHqB8KkrojJARSwwToHVUUAU6TazoWIzQEuBCpvwgkhAvaLggHPWNUCSa3Zf4fswQOfVzU4u+1hAMXpCumrgSkCSDNQsc/VQQOdPVFm8KDpABJWXaEf/GkCVwKVQEZNQQDQ8rgPCmkRAxvJZPf/MH0C3gh88+mEyQE8IjwD8uFZAXrLI2mUZVEBhNht8dwQEQCA3hypg8b0/WlGszQPuRUAf0R4bgZNRQKsKviV2UlNA22fxkPP5K0DV1bifAupEQEv7JDCRUFBAZa/JmNEyVEAGkC2UslwLQNSbQGwIelRAWvudIOilOEBbsVcrq/RVQMFXYOC3LlVAAHP/sDydN0Delq4yvmRSQP/EWqabwVBAFG6ewRQXBUAj5/bZoxRQQAudqo52qVJAr5I7086rQECAS2uzX51XQIkqHG7uDDNAekCtSNezWEDGpg4IMN9FQHKrg4MH9j5Ae7yCd8HmNkDvpJkW+3dNQAmZVtJwvzJANnT5+pibUUAQcDhKF1c0QNxE7/VNGzRAgFxqv9mMJECQIPRPtSZGQLs6KEP6P1BAtCL/N4aaVUCAhuCb/cY4QAIsk+miMEpAAwu/sRgpVUDHgNC095JYQMLKJYBG6ldAgph9yUPeTEAbWOIaFmY2QPvLM+T/9k1ARZdmT0kZCkBOC+IHE2L/P94DTmAD7VBA5lUrlOGoNEB696Ih5ylBQNiFIN/551VACWyMjvBJQEC0X5w34A9HQKYVAh9afFBADZGi1DHUWEBc1rKqyJQ2QPsfg19IEC1AyCtZZZ9H+z97Clmi/bRFQGfhHtOaRlFAwGlw3Adg4j8I+uj/1T5TQPPiIPg5FVJAg4TZo6OvTEC/LF2GMfBQQABCMXGouVBALgocaMXjMkDEVEvHudxYQCr3KCbyBVNA4XZd7TwCR0DHC2EKdvZFQJpWX6P6qFhAGHnVdJCm3z+lN2lKnfBBQEYenps25UZASylBtuKPSECbFZMSbkJYQHduKtRqCEJAw8aC166TTEAyF0wb5RxMQP8+HPbSPDxAfXdPSDebWEBcvkEqOv1SQL4p8N7SVgVA0DJmBXU3SUDDX/FPKodYQDp8jiSAS01AeUZj3rX4SECS5AY/uP5GQP7DnEhgVCNAfBpBX+sEVkCVzzyHI5VWQJFYqdPGBlJAcg2HSAT8UkCx5tc3DLRBQOJlP049e1ZADWMXKV43UEBL3u6zjTIqQOJOkFj0QBVAs5ek8ljqWEDE5t8FD302QIRudTaUgztAsG7rx2ihUUA52Pgrvc47QJIrTIeqE/8/RiSfzlEpQEAgf62agyZLQDcToHbgxTVAavOoDfGcRkA0AiG5GNg9QEib/GtAzUVA4LnQuXbePUDv29iB1CVBQM7j7e/T4hZANT9BKlXPO0ATvzF2GNNQQMg2RAVMzzNA4EHC3Z32SUAD17CBHMJYQJhG3ff6AVhARYtgLhD4VUCrryVLPiBBQP05EGMD/09AX4bQK68MJ0C/AHIGUQhJQKJtvJccy0xAAnwe+MMaN0Da81VsZoZYQFOP6J5tXVRAygAuKFekPUBunjoG8oJLQKXui+F5l1JADx1JYWJHMUCR5RYjiPJXQOCBeaPS+C1AKPHCv2UNIUD2v21ZZ/xQQKq/58Nm+x5AYH9oUfp9R0DaPMb7jQxWQA4r39DjYypAh1dFjgD2QUCU9CGXS1IgQFbXKhmPhFRANKx73jnfN0BRqszxp+NFQIQV/eOMPldA/KPv5BIO5T9qZscZNGVLQIZkn/TxME1A9uMwxjMWUEClJ5WSiFxJQKsu/lqvt0hATI0waaAMWEAg1LYZD7c7QJTdrga02lZAZq30oQAYU0B0WVX2VBBYQJmVzxekjTNAEovjhLNOIUBaTx+lLyhKQOy4UeaE7VFAWFhgVK9UVEBRu3JreHFXQA==\"},\"shape\":[2000],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"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\"},\"shape\":[2000],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p2872\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p2873\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p2868\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":null},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.6},\"radius\":{\"type\":\"value\",\"value\":1}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p2869\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":null},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1},\"radius\":{\"type\":\"value\",\"value\":1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p2870\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":null},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2},\"radius\":{\"type\":\"value\",\"value\":1}}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p2835\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"BoxSelectTool\",\"id\":\"p2860\",\"attributes\":{\"renderers\":\"auto\",\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p2861\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"editable\":true,\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}}]}},\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p2853\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p2854\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p2856\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p2855\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p2846\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p2847\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p2849\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p2848\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p2852\",\"attributes\":{\"axis\":{\"id\":\"p2846\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p2859\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p2853\"}}}]}},{\"id\":\"p2874\"}]}}]}}],\"callbacks\":{\"type\":\"map\"}}};\n", " const render_items = [{\"docid\":\"4e97556b-5f77-4977-8ae5-b274ae044b20\",\"roots\":{\"p2877\":\"eb581b70-1c6d-474c-8932-24f6a1270ce5\"},\"root_ids\":[\"p2877\"]}];\n", " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", " }\n", " if (root.Bokeh !== undefined) {\n", " embed_document(root);\n", " } else {\n", " let attempts = 0;\n", " const timer = setInterval(function(root) {\n", " if (root.Bokeh !== undefined) {\n", " clearInterval(timer);\n", " embed_document(root);\n", " } else {\n", " attempts++;\n", " if (attempts > 100) {\n", " clearInterval(timer);\n", " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", " }\n", " }\n", " }, 10, root)\n", " }\n", "})(window);" ], "application/vnd.bokehjs_exec.v0+json": "" }, "metadata": { "application/vnd.bokehjs_exec.v0+json": { "id": "p2877" } }, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "\n", "from bokeh import events\n", "from bokeh.layouts import column, row\n", "from bokeh.models import Button, CustomJS, Div\n", "from bokeh.plotting import figure\n", "\n", "\n", "x = np.random.random(size=2000) * 100\n", "y = np.random.random(size=2000) * 100\n", "\n", "p = figure(tools=\"box_select\")\n", "p.scatter(x, y, radius=1, fill_alpha=0.6, line_color=None)\n", "\n", "div = Div(width=400)\n", "button = Button(label=\"Button\")\n", "layout = column(button, row(p, div))\n", "\n", "# Events with no attributes\n", "button.js_on_event(\n", " events.ButtonClick,\n", " CustomJS(\n", " args=dict(div=div),\n", " code=\"\"\"\n", "div.text = \"Button!\";\n", "\"\"\",\n", " ),\n", ")\n", "\n", "p.js_on_event(\n", " events.SelectionGeometry,\n", " CustomJS(\n", " args=dict(div=div),\n", " code=\"\"\"\n", "div.text = \"Selection!

\" + JSON.stringify(cb_obj.geometry, undefined, 2);\n", "\"\"\",\n", " ),\n", ")\n", "\n", "show(layout)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Zusätzliche Informationen\n", "\n", "Es gibt viele Arten von Interaktionen und Ereignissen, die mit `CustomJS`-Rückrufen verbunden werden können:\n", "\n", "* **Widgets**: - Button, Toggle, Dropdown, TextInput, AutocompleteInput, Select, Multiselect, Slider, (DateRangeSlider), DatePicker,\n", "* **Tools**: - TapTool, BoxSelectTool, HoverTool,\n", "* **Selection**: - ColumnDataSource, AjaxDataSource, BlazeDataSource, ServerDataSource\n", "* **Ranges**: - Range1d, DataRange1d, FactorRange\n", "\n", "Vollständigere Beispiele findet ihr in [JavaScript callbacks](https://docs.bokeh.org/en/latest/docs/user_guide/interaction/js_callbacks.html). " ] } ], "metadata": { "kernelspec": { "display_name": "Python 3.11 Kernel", "language": "python", "name": "python311" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.4" }, "latex_envs": { "LaTeX_envs_menu_present": true, "autoclose": false, "autocomplete": true, "bibliofile": "biblio.bib", "cite_by": "apalike", "current_citInitial": 1, "eqLabelWithNumbers": true, "eqNumInitial": 1, "hotkeys": { "equation": "Ctrl-E", "itemize": "Ctrl-I" }, "labels_anchors": false, "latex_user_defs": false, "report_style_numbering": false, "user_envs_cfg": false }, "widgets": { "application/vnd.jupyter.widget-state+json": { "state": {}, "version_major": 2, "version_minor": 0 } } }, "nbformat": 4, "nbformat_minor": 4 }