j1-template 2022.5.0.rc1 → 2022.5.0.rc4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (378) hide show
  1. checksums.yaml +4 -4
  2. data/assets/data/banner.html +24 -1
  3. data/assets/themes/j1/adapter/js/masterslider.js +22 -5
  4. data/assets/themes/j1/core/css/themes/unolight/bootstrap.css +56 -0
  5. data/assets/themes/j1/core/css/themes/unolight/bootstrap.min.css +1 -1
  6. data/lib/j1/version.rb +1 -1
  7. data/lib/starter_web/Gemfile +270 -270
  8. data/lib/starter_web/_config.yml +19 -9
  9. data/lib/starter_web/_data/blocks/banner.yml +17 -0
  10. data/lib/starter_web/_data/modules/defaults/masterslider.yml +1 -1
  11. data/lib/starter_web/_data/modules/justifiedGallery.yml +82 -0
  12. data/lib/starter_web/_data/modules/masterslider.yml +5 -9
  13. data/lib/starter_web/_data/modules/navigator_menu.yml +208 -168
  14. data/lib/starter_web/_includes/attributes.asciidoc +18 -14
  15. data/lib/starter_web/_includes/tables/template_variables.asciidoc +1 -1
  16. data/lib/starter_web/_plugins/asciidoctor-extensions/lightbox-block.rb +4 -4
  17. data/lib/starter_web/assets/images/pages/features/blog-post-navigator-1280x1000.jpg +0 -0
  18. data/lib/starter_web/assets/images/pages/features/bootswatch-themes-1280x800.png +0 -0
  19. data/lib/starter_web/assets/images/pages/features/clipboard-1280x600.jpg +0 -0
  20. data/lib/starter_web/assets/images/pages/features/comments-1280x600.jpg +0 -0
  21. data/lib/starter_web/assets/images/pages/features/cookie-consent-1280x800.jpg +0 -0
  22. data/lib/starter_web/assets/images/pages/features/desktop-web-navigation-1280x1000.jpg +0 -0
  23. data/lib/starter_web/assets/images/pages/features/example-content-1280x800.jpg +0 -0
  24. data/lib/starter_web/assets/images/pages/features/example-content-present-videos-1280x800.jpg +0 -0
  25. data/lib/starter_web/assets/images/pages/features/fab-1280x500.jpg +0 -0
  26. data/lib/starter_web/assets/images/pages/features/full-text-search-1280x800.jpg +0 -0
  27. data/lib/starter_web/assets/images/pages/features/global-mobile-traffic-1920x1080.png +0 -0
  28. data/lib/starter_web/assets/images/pages/features/google-lighthouse-1080x300.png +0 -0
  29. data/lib/starter_web/assets/images/pages/features/intro-panel-1280x800.jpg +0 -0
  30. data/lib/starter_web/assets/images/pages/features/master-header-1280x600.jpg +0 -0
  31. data/lib/starter_web/assets/images/pages/features/mobile-navigation-600x800.png +0 -0
  32. data/lib/starter_web/assets/images/pages/features/native-speakers-by-language.png +0 -0
  33. data/lib/starter_web/assets/images/pages/features/nav-module-1280x300.jpg +0 -0
  34. data/lib/starter_web/assets/images/pages/features/nbi-barchart-1280x800.jpg +0 -0
  35. data/lib/starter_web/assets/images/pages/features/teaser-banner-1280x600.jpg +0 -0
  36. data/lib/starter_web/assets/images/pages/features/translator-1280x800.jpg +0 -0
  37. data/lib/starter_web/assets/images/sticker/600x600/sticker-new-version.png +0 -0
  38. data/lib/starter_web/assets/images/sticker/scalable/readme +0 -0
  39. data/lib/starter_web/package.json +6 -6
  40. data/lib/starter_web/pages/public/_jupyter/docs/_includes/attributes.asciidoc +67 -0
  41. data/lib/starter_web/pages/public/_jupyter/docs/_includes/documents/j1_docs_example_static.asciidoc +232 -0
  42. data/lib/starter_web/pages/public/_jupyter/docs/binderhub.adoc +631 -0
  43. data/lib/starter_web/pages/public/_jupyter/docs/j1-nbinteract.adoc +638 -0
  44. data/lib/starter_web/pages/public/_jupyter/docs/jupyterhub.adoc +248 -0
  45. data/lib/starter_web/pages/public/_jupyter/docs/nbinteract-widget-manual.adoc +928 -0
  46. data/lib/starter_web/pages/public/_jupyter/examples/distributed/j1-circular-times-table.adoc +139 -0
  47. data/lib/starter_web/pages/public/_jupyter/examples/distributed/j1-common-used-widgets.adoc +229 -0
  48. data/lib/starter_web/pages/public/_jupyter/examples/distributed/j1-odes-in-python.adoc +112 -0
  49. data/lib/starter_web/pages/public/_jupyter/examples/localized/j1-altair/j1-altair-visualisations.adoc +142 -0
  50. data/lib/starter_web/pages/public/_jupyter/examples/localized/j1-bokeh/j1-bokeh-visualisations.adoc +171 -0
  51. data/lib/starter_web/pages/public/_jupyter/examples/localized/j1-bokeh/j1-bqplot-eamples.adoc +111 -0
  52. data/lib/starter_web/pages/public/_jupyter/examples/localized/j1-plotly/j1-plotly-visualisations.adoc +94 -0
  53. data/lib/starter_web/pages/public/_jupyter/examples/localized/j1_climate-change-forecast.adoc +106 -0
  54. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_altair_interactive-checkpoint.ipynb +16260 -0
  55. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_bgplot_line_plot-checkpoint.ipynb +247 -0
  56. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_circular_times_table-Copy1-checkpoint.ipynb +12382 -0
  57. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_circular_times_table-checkpoint.ipynb +12387 -0
  58. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_circular_times_table-short-checkpoint.ipynb +12170 -0
  59. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_climate_change_forecast-checkpoint.ipynb +1058 -0
  60. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_docs_example_dynamic-checkpoint.ipynb +14478 -0
  61. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_interactive_widgets-Copy1-checkpoint.ipynb +379 -0
  62. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_interactive_widgets-checkpoint.ipynb +442 -0
  63. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets-checkpoint.ipynb +523 -0
  64. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets.line_charts-checkpoint.ipynb +84 -0
  65. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets.questions-checkpoint.ipynb +194 -0
  66. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_bar_chart-checkpoint.ipynb +89 -0
  67. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_bar_charts-Copy1-checkpoint.ipynb +164 -0
  68. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_bar_charts-checkpoint.ipynb +173 -0
  69. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_bar_charts.1-checkpoint.ipynb +256 -0
  70. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_barcharts-checkpoint.ipynb +126 -0
  71. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_hist_chart-checkpoint.ipynb +87 -0
  72. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_line_chart-checkpoint.ipynb +90 -0
  73. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_line_charts-checkpoint.ipynb +87 -0
  74. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_question_multiple_choice-checkpoint.ipynb +64 -0
  75. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_question_short_answer-checkpoint.ipynb +122 -0
  76. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_questions-checkpoint.ipynb +181 -0
  77. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_scatter_chart-checkpoint.ipynb +89 -0
  78. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_scatter_charts-checkpoint.ipynb +175 -0
  79. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_scatter_drag_chart-checkpoint.ipynb +87 -0
  80. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_ode_selected-checkpoint.ipynb +14478 -0
  81. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_odes_in_python-checkpoint.ipynb +15227 -0
  82. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/factor_by_factor.mp4 +0 -0
  83. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_circular_times_table.ipynb +12382 -0
  84. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_climate_change_forecast.ipynb +1058 -0
  85. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_docs_example_dynamic.ipynb +14478 -0
  86. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_interactive_widgets.ipynb +442 -0
  87. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_nbi_widgets.ipynb +523 -0
  88. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_nbi_widgets_bar_chart.ipynb +89 -0
  89. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_nbi_widgets_hist_chart.ipynb +87 -0
  90. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_nbi_widgets_line_chart.ipynb +90 -0
  91. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_nbi_widgets_question_multiple_choice.ipynb +64 -0
  92. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_nbi_widgets_question_short_answer.ipynb +122 -0
  93. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_nbi_widgets_scatter_chart.ipynb +89 -0
  94. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_nbi_widgets_scatter_drag_chart.ipynb +87 -0
  95. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_odes_in_python.ipynb +15227 -0
  96. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/line_by_line.mp4 +0 -0
  97. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/point_by_point.mp4 +0 -0
  98. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-altair-tutorial/.ipynb_checkpoints/j1_altair_interactive-checkpoint.ipynb +16296 -0
  99. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-altair-tutorial/.ipynb_checkpoints/j1_altair_non_interactive-checkpoint.ipynb +15385 -0
  100. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-altair-tutorial/j1_altair_interactive.ipynb +16296 -0
  101. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-altair-tutorial/j1_altair_non_interactive.ipynb +15385 -0
  102. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/00 - Introduction and Setup-checkpoint.ipynb +717 -0
  103. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/01 - Basic Plotting-checkpoint.ipynb +1381 -0
  104. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/02 - Styling and Theming-checkpoint.ipynb +1440 -0
  105. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/03 - Data Sources and Transformations-checkpoint.ipynb +927 -0
  106. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/04 - Adding Annotations-checkpoint.ipynb +1105 -0
  107. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/05 - Presentation Layouts-checkpoint.ipynb +578 -0
  108. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/06 - Linking and Interactions-checkpoint.ipynb +1196 -0
  109. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/07 - Bar and Categorical Data Plots-checkpoint.ipynb +1681 -0
  110. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/08 - Graph and Network Plots-checkpoint.ipynb +680 -0
  111. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/09 - Geographic Plots-checkpoint.ipynb +693 -0
  112. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/10 - Exporting and Embedding-checkpoint.ipynb +751 -0
  113. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/11 - Running Bokeh Applications-checkpoint.ipynb +770 -0
  114. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/bokeh_tut_00_introduction_and_setup-checkpoint.ipynb +666 -0
  115. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_01_basic_plotting-checkpoint.ipynb +1365 -0
  116. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_02_styling_and_theming-checkpoint.ipynb +1405 -0
  117. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_03_data_sources_and_transformations-checkpoint.ipynb +856 -0
  118. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_04_adding_annotations-checkpoint.ipynb +1167 -0
  119. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_05_presentation_layouts-checkpoint.ipynb +601 -0
  120. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_06_linking_and_interactions-checkpoint.ipynb +1356 -0
  121. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_07_bar_and_categorical_data_plots-checkpoint.ipynb +1742 -0
  122. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_08_graph_and_network_plots-checkpoint.ipynb +625 -0
  123. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_09_geographic_plots-checkpoint.ipynb +685 -0
  124. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_10_exporting_and_embedding-checkpoint.ipynb +726 -0
  125. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_10_exporting_and_embedding-checkpoint.org +726 -0
  126. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_10_exporting_and_embedding.new-checkpoint.ipynb +560 -0
  127. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_11_running_bokeh_applications-checkpoint.ipynb +716 -0
  128. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/j1_bokeh_01_basic_plotting.ipynb +1365 -0
  129. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/j1_bokeh_02_styling_and_theming.ipynb +1405 -0
  130. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/j1_bokeh_03_data_sources_and_transformations.ipynb +856 -0
  131. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/j1_bokeh_04_adding_annotations.ipynb +1167 -0
  132. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/j1_bokeh_05_presentation_layouts.ipynb +601 -0
  133. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/j1_bokeh_06_linking_and_interactions.ipynb +1356 -0
  134. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/j1_bokeh_07_bar_and_categorical_data_plots.ipynb +1742 -0
  135. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/j1_bokeh_08_graph_and_network_plots.ipynb +625 -0
  136. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/j1_bokeh_09_geographic_plots.ipynb +685 -0
  137. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bqplot/.ipynb_checkpoints/j1_mathplot_vs_bqplot-checkpoint.ipynb +336 -0
  138. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bqplot/advanced/Feature_Vector_Distribution-Iris-Digits.ipynb +433 -0
  139. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bqplot/j1_bgplot_line_plot.ipynb +244 -0
  140. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bqplot/j1_circular_times_table-short.ipynb +12170 -0
  141. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bqplot/j1_mathplot_vs_bqplot.ipynb +336 -0
  142. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/.ipynb_checkpoints/Index-checkpoint.ipynb +163 -0
  143. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/.ipynb_checkpoints/Tutorials-checkpoint.ipynb +51 -0
  144. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Advanced Plotting/Advanced Plotting.ipynb +289 -0
  145. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Advanced Plotting/Animations.ipynb +266 -0
  146. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Advanced Plotting/Axis Properties.ipynb +396 -0
  147. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Advanced Plotting/Plotting Dates.ipynb +318 -0
  148. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Equity Index Performance/Time Series.ipynb +158 -0
  149. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Equity Index Performance/spx_prices.csv +6799 -0
  150. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Feature_Vector_Distribution-Iris-Digits.ipynb +470 -0
  151. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Index.ipynb +49 -0
  152. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Logs Analytics/Logs Dashboard.ipynb +378 -0
  153. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Mobile Patent Suits.ipynb +123 -0
  154. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Neural Network.ipynb +177 -0
  155. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Outlier Detection.ipynb +311 -0
  156. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Wealth Of Nations/Bubble Chart.ipynb +255 -0
  157. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Wealth Of Nations/Choropleth.ipynb +275 -0
  158. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Wealth Of Nations/nations.json +1 -0
  159. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Wealth Of Nations/world_map_codes.csv +234 -0
  160. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Basic Plotting/.ipynb_checkpoints/Basic Plotting-checkpoint.ipynb +186 -0
  161. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Basic Plotting/.ipynb_checkpoints/Pyplot-checkpoint.ipynb +794 -0
  162. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Basic Plotting/.ipynb_checkpoints/Untitled-checkpoint.ipynb +323 -0
  163. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Basic Plotting/Basic Plotting.ipynb +261 -0
  164. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Basic Plotting/Pyplot.ipynb +1489 -0
  165. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Index.ipynb +163 -0
  166. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Interactions/Interaction Layer.ipynb +966 -0
  167. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Interactions/Mark Interactions.ipynb +476 -0
  168. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Interactions/Selectors.ipynb +427 -0
  169. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Introduction.ipynb +528 -0
  170. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Bars.ipynb +480 -0
  171. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Bins.ipynb +217 -0
  172. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Boxplot.ipynb +253 -0
  173. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Candles.ipynb +225 -0
  174. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/FlexLine.ipynb +123 -0
  175. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Graph.ipynb +357 -0
  176. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/GridHeatMap.ipynb +422 -0
  177. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/HeatMap.ipynb +157 -0
  178. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Hist.ipynb +176 -0
  179. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Image.ipynb +195 -0
  180. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Label.ipynb +189 -0
  181. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Lines.ipynb +565 -0
  182. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Map.ipynb +182 -0
  183. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Market Map.ipynb +315 -0
  184. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Pie.ipynb +465 -0
  185. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Scatter.ipynb +835 -0
  186. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Bars.ipynb +362 -0
  187. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Bins.ipynb +252 -0
  188. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Boxplot.ipynb +273 -0
  189. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Candles.ipynb +242 -0
  190. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/GridHeatMap.ipynb +417 -0
  191. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/HeatMap.ipynb +155 -0
  192. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Hist.ipynb +238 -0
  193. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Image.ipynb +152 -0
  194. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Label.ipynb +206 -0
  195. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Lines.ipynb +474 -0
  196. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Map.ipynb +181 -0
  197. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Pie.ipynb +310 -0
  198. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Scatter.ipynb +702 -0
  199. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Scales/Color Scales.ipynb +495 -0
  200. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/.ipynb_checkpoints/Feature_Vector_Distribution-Iris-Digits-checkpoint.ipynb +433 -0
  201. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/.ipynb_checkpoints/Linking Plots With Widgets-checkpoint.ipynb +326 -0
  202. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/.ipynb_checkpoints/Updating Plots-Copy1-checkpoint.ipynb +177 -0
  203. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/.ipynb_checkpoints/Updating Plots-checkpoint.ipynb +177 -0
  204. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/Brush Interval Selector.ipynb +154 -0
  205. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/Fast Interval Selector.ipynb +152 -0
  206. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/Gaussian Density Widget.ipynb +128 -0
  207. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/Gaussian Density.ipynb +113 -0
  208. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/Linking Plots With Widgets.ipynb +326 -0
  209. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/Object Model.ipynb +179 -0
  210. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/Pyplot.ipynb +174 -0
  211. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/Updating Plots.ipynb +177 -0
  212. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials.ipynb +51 -0
  213. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/data_files/country_codes.csv +213 -0
  214. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/data_files/gdp_per_capita.csv +56 -0
  215. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/data_files/state_codes.csv +52 -0
  216. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/data_files/trees.jpg +0 -0
  217. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/.ipynb_checkpoints/nbi_docs_examples_central_limit_theorem-checkpoint.ipynb +247 -0
  218. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/.ipynb_checkpoints/nbi_docs_examples_variability_of_the_sample_mean-checkpoint.ipynb +323 -0
  219. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/.ipynb_checkpoints/nbi_docs_recipes_graphing-checkpoint.ipynb +387 -0
  220. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/.ipynb_checkpoints/nbi_docs_recipes_interactive_questions-checkpoint.ipynb +185 -0
  221. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/.ipynb_checkpoints/nbi_docs_recipes_layout-checkpoint.ipynb +384 -0
  222. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/.ipynb_checkpoints/nbi_docs_tutorial_interact-checkpoint.ipynb +254 -0
  223. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/.ipynb_checkpoints/nbi_docs_tutorial_monty_hall-checkpoint.ipynb +732 -0
  224. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_examples_central_limit_theorem.ipynb +247 -0
  225. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_examples_correlation.ipynb +651 -0
  226. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_examples_empirical_distributions.ipynb +773 -0
  227. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_examples_linear_regression.ipynb +111 -0
  228. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_examples_probability_distribution_plots.ipynb +199 -0
  229. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_examples_sampling_from_a_population.ipynb +421 -0
  230. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_examples_variability_of_the_sample_mean.ipynb +323 -0
  231. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_recipes_graphing.ipynb +387 -0
  232. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_recipes_interactive_questions.ipynb +185 -0
  233. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_recipes_layout.ipynb +384 -0
  234. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_tutorial_interact.ipynb +254 -0
  235. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_tutorial_monty_hall.ipynb +732 -0
  236. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Advanced Plotting.html +373 -0
  237. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Animations.html +361 -0
  238. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Axis Properties.html +569 -0
  239. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Bars.html +487 -0
  240. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Basic Plotting.html +341 -0
  241. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Bins.html +259 -0
  242. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Boxplot.html +277 -0
  243. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Brush Interval Selector.html +182 -0
  244. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Bubble Chart.html +299 -0
  245. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Candles.html +252 -0
  246. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Choropleth.html +318 -0
  247. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Color Scales.html +514 -0
  248. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Fast Interval Selector.html +182 -0
  249. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Feature_Vector_Distribution-Iris-Digits.html +479 -0
  250. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/FlexLine.html +128 -0
  251. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Gaussian Density Widget.html +152 -0
  252. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Gaussian Density.html +137 -0
  253. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Graph.html +484 -0
  254. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/GridHeatMap.html +483 -0
  255. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/HeatMap.html +170 -0
  256. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Hist.html +349 -0
  257. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Image.html +177 -0
  258. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Index.html +29 -0
  259. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Interaction Layer.html +1372 -0
  260. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Introduction.html +749 -0
  261. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Label.html +268 -0
  262. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Lines.html +704 -0
  263. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Linking Plots With Widgets.html +389 -0
  264. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Logs Dashboard.html +455 -0
  265. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Map.html +229 -0
  266. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Mark Interactions.html +613 -0
  267. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Market Map.html +413 -0
  268. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Mobile Patent Suits.html +131 -0
  269. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Neural Network.html +190 -0
  270. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Object Model.html +193 -0
  271. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Outlier Detection.html +363 -0
  272. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Pie.html +367 -0
  273. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Plotting Dates.html +337 -0
  274. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Pyplot.html +196 -0
  275. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Scatter.html +948 -0
  276. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Selectors.html +489 -0
  277. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Time Series.html +173 -0
  278. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Tutorials.html +40 -0
  279. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Updating Plots.html +228 -0
  280. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_altair_interactive.html +2216 -0
  281. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_altair_non_interactive.html +1170 -0
  282. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_bgplot_line_plot.html +318 -0
  283. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_bokeh_01_basic_plotting.html +1479 -0
  284. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_bokeh_02_styling_and_theming.html +1524 -0
  285. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_bokeh_03_data_sources_and_transformations.html +983 -0
  286. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_bokeh_04_adding_annotations.html +1280 -0
  287. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_bokeh_05_presentation_layouts.html +660 -0
  288. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_bokeh_06_linking_and_interactions.html +1563 -0
  289. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_bokeh_07_bar_and_categorical_data_plots.html +1888 -0
  290. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_bokeh_08_graph_and_network_plots.html +689 -0
  291. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_bokeh_09_geographic_plots.html +767 -0
  292. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_circular_times_table-short.html +475 -0
  293. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_circular_times_table.html +747 -0
  294. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_climate_change_forecast.html +1250 -0
  295. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_docs_example_dynamic.html +186 -0
  296. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_interactive_widgets.html +512 -0
  297. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_mathplot_vs_bqplot.html +407 -0
  298. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_nbi_widgets.html +629 -0
  299. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_nbi_widgets_bar_chart.html +95 -0
  300. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_nbi_widgets_hist_chart.html +93 -0
  301. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_nbi_widgets_line_chart.html +96 -0
  302. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_nbi_widgets_question_multiple_choice.html +70 -0
  303. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_nbi_widgets_question_short_answer.html +156 -0
  304. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_nbi_widgets_scatter_chart.html +95 -0
  305. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_nbi_widgets_scatter_drag_chart.html +93 -0
  306. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_odes_in_python.html +955 -0
  307. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_examples_central_limit_theorem.html +290 -0
  308. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_examples_correlation.html +818 -0
  309. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_examples_empirical_distributions.html +351 -0
  310. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_examples_linear_regression.html +106 -0
  311. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_examples_probability_distribution_plots.html +228 -0
  312. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_examples_sampling_from_a_population.html +518 -0
  313. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_examples_variability_of_the_sample_mean.html +372 -0
  314. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_recipes_graphing.html +473 -0
  315. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_recipes_interactive_questions.html +242 -0
  316. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_recipes_layout.html +496 -0
  317. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_tutorial_interact.html +329 -0
  318. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_tutorial_monty_hall.html +866 -0
  319. data/lib/starter_web/pages/public/_jupyter/where_to_go.adoc +270 -0
  320. data/lib/starter_web/pages/public/features/general.adoc +74 -33
  321. data/lib/starter_web/pages/public/features/template.adoc +159 -68
  322. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_interactive_widgets.html +512 -512
  323. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets.html +629 -629
  324. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets_bar_chart.html +95 -95
  325. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets_hist_chart.html +93 -93
  326. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets_line_chart.html +96 -96
  327. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets_question_multiple_choice.html +70 -70
  328. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets_question_short_answer.html +156 -156
  329. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets_scatter_chart.html +95 -95
  330. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets_scatter_drag_chart.html +93 -93
  331. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_odes_in_python.html +955 -955
  332. data/lib/starter_web/pages/public/learn/_roundtrip/100_present_images.adoc +313 -0
  333. data/lib/starter_web/pages/public/learn/_roundtrip/100_present_videos.adoc +281 -0
  334. data/lib/starter_web/pages/public/learn/_roundtrip/200_typography.adoc +253 -0
  335. data/lib/starter_web/pages/public/learn/_roundtrip/300_icon_fonts.adoc +579 -0
  336. data/lib/starter_web/pages/public/learn/_roundtrip/400_asciidoc_extensions.adoc +718 -0
  337. data/lib/starter_web/pages/public/learn/_roundtrip/410_bs_modals_extentions.adoc +91 -0
  338. data/lib/starter_web/pages/public/learn/_roundtrip/420_responsive_tables_extensions.adoc +420 -0
  339. data/lib/starter_web/pages/public/learn/_roundtrip/500_themes.adoc +250 -0
  340. data/lib/starter_web/pages/public/learn/_roundtrip/600_quicksearch.adoc +425 -0
  341. data/lib/starter_web/pages/public/learn/_roundtrip/_includes/attributes.asciidoc +118 -0
  342. data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/100_gistblock.asciidoc +28 -0
  343. data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/410_bottom_info.asciidoc +14 -0
  344. data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/410_bottom_left_warning.asciidoc +11 -0
  345. data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/410_bottom_right_danger.asciidoc +11 -0
  346. data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/410_central_success.asciidoc +11 -0
  347. data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/410_full_height_left_info.asciidoc +11 -0
  348. data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/410_full_height_right_success.asciidoc +11 -0
  349. data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/410_table_bs_modal_examples.asciidoc +47 -0
  350. data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/410_top_info.asciidoc +11 -0
  351. data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/410_top_left_info.asciidoc +11 -0
  352. data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/410_top_right_success.asciidoc +11 -0
  353. data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/419_advanced_modals_demo.asciidoc +337 -0
  354. data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/tables/bs_modal_examples.asciidoc +47 -0
  355. data/lib/starter_web/pages/public/learn/_roundtrip/_includes/google-ad.js +130 -0
  356. data/lib/starter_web/pages/public/learn/roundtrip/100_present_images.adoc +6 -5
  357. data/lib/starter_web/pages/public/learn/roundtrip/300_icon_fonts.adoc +1 -2
  358. data/lib/starter_web/pages/public/learn/roundtrip/400_asciidoc_extensions.adoc +4 -2
  359. data/lib/starter_web/pages/public/learn/roundtrip/500_themes.adoc +1 -1
  360. data/lib/starter_web/pages/public/learn/roundtrip/_includes/attributes.asciidoc +1 -1
  361. data/lib/starter_web/utilsrv/_defaults/package.json +1 -1
  362. data/lib/starter_web/utilsrv/package.json +1 -1
  363. metadata +384 -17
  364. data/lib/starter_web/_includes/_attributes.asciidoc +0 -575
  365. data/lib/starter_web/assets/images/pages/features/bootswatch-themes-1080x800.jpg +0 -0
  366. data/lib/starter_web/assets/images/pages/features/comments-1080x600.jpg +0 -0
  367. data/lib/starter_web/assets/images/pages/features/cookie-consent-1080x800.jpg +0 -0
  368. data/lib/starter_web/assets/images/pages/features/example-content-present-videos-1080x800.jpg +0 -0
  369. data/lib/starter_web/assets/images/pages/features/fab-1080x500.jpg +0 -0
  370. data/lib/starter_web/assets/images/pages/features/full-text-search-1080x800.jpg +0 -0
  371. data/lib/starter_web/assets/images/pages/features/global-mobile-traffic-1920x1080.jpg +0 -0
  372. data/lib/starter_web/assets/images/pages/features/google-lighthouse-1080x300.jpg +0 -0
  373. data/lib/starter_web/assets/images/pages/features/intro-panel-1080x800.jpg +0 -0
  374. data/lib/starter_web/assets/images/pages/features/mobile-navigation-600x800.jpg +0 -0
  375. data/lib/starter_web/assets/images/pages/features/native-speakers-by-language.jpg +0 -0
  376. data/lib/starter_web/assets/images/pages/features/nav-module-1080x300.jpg +0 -0
  377. data/lib/starter_web/assets/images/pages/features/teaser-banner-1080x600.jpg +0 -0
  378. data/lib/starter_web/assets/images/pages/features/translator-1080x800.jpg +0 -0
@@ -0,0 +1,1356 @@
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "## 6. Linking and Interactions\n",
8
+ "\n",
9
+ "Now that we know from the previous chapter how multiple plots can be placed together in a layout, we can start to look at how different plots can be linked together, or how plots can be linked to widgets. "
10
+ ]
11
+ },
12
+ {
13
+ "cell_type": "code",
14
+ "execution_count": 1,
15
+ "metadata": {},
16
+ "outputs": [],
17
+ "source": [
18
+ "from bokeh import events\n",
19
+ "from bokeh.io import output_notebook, show\n",
20
+ "from bokeh.plotting import figure\n",
21
+ "\n",
22
+ "from bokeh.layouts import gridplot, column, row\n",
23
+ "from bokeh.models import Button, ColumnDataSource, CustomJS, Div, HoverTool, TapTool\n",
24
+ "from bokeh.models.widgets import Slider, Button\n",
25
+ "\n",
26
+ "from random import random\n",
27
+ "import numpy as np"
28
+ ]
29
+ },
30
+ {
31
+ "cell_type": "code",
32
+ "execution_count": 2,
33
+ "metadata": {},
34
+ "outputs": [
35
+ {
36
+ "data": {
37
+ "text/html": [
38
+ "<div class=\"bk-root\">\n",
39
+ " <a href=\"https://bokeh.org\" target=\"_blank\" class=\"bk-logo bk-logo-small bk-logo-notebook\"></a>\n",
40
+ " <span id=\"1002\">Loading BokehJS ...</span>\n",
41
+ " </div>\n"
42
+ ]
43
+ },
44
+ "metadata": {},
45
+ "output_type": "display_data"
46
+ },
47
+ {
48
+ "data": {
49
+ "application/javascript": [
50
+ "(function(root) {\n",
51
+ " function now() {\n",
52
+ " return new Date();\n",
53
+ " }\n",
54
+ "\n",
55
+ " const force = true;\n",
56
+ "\n",
57
+ " if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n",
58
+ " root._bokeh_onload_callbacks = [];\n",
59
+ " root._bokeh_is_loading = undefined;\n",
60
+ " }\n",
61
+ "\n",
62
+ "const JS_MIME_TYPE = 'application/javascript';\n",
63
+ " const HTML_MIME_TYPE = 'text/html';\n",
64
+ " const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n",
65
+ " const CLASS_NAME = 'output_bokeh rendered_html';\n",
66
+ "\n",
67
+ " /**\n",
68
+ " * Render data to the DOM node\n",
69
+ " */\n",
70
+ " function render(props, node) {\n",
71
+ " const script = document.createElement(\"script\");\n",
72
+ " node.appendChild(script);\n",
73
+ " }\n",
74
+ "\n",
75
+ " /**\n",
76
+ " * Handle when an output is cleared or removed\n",
77
+ " */\n",
78
+ " function handleClearOutput(event, handle) {\n",
79
+ " const cell = handle.cell;\n",
80
+ "\n",
81
+ " const id = cell.output_area._bokeh_element_id;\n",
82
+ " const server_id = cell.output_area._bokeh_server_id;\n",
83
+ " // Clean up Bokeh references\n",
84
+ " if (id != null && id in Bokeh.index) {\n",
85
+ " Bokeh.index[id].model.document.clear();\n",
86
+ " delete Bokeh.index[id];\n",
87
+ " }\n",
88
+ "\n",
89
+ " if (server_id !== undefined) {\n",
90
+ " // Clean up Bokeh references\n",
91
+ " const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n",
92
+ " cell.notebook.kernel.execute(cmd_clean, {\n",
93
+ " iopub: {\n",
94
+ " output: function(msg) {\n",
95
+ " const id = msg.content.text.trim();\n",
96
+ " if (id in Bokeh.index) {\n",
97
+ " Bokeh.index[id].model.document.clear();\n",
98
+ " delete Bokeh.index[id];\n",
99
+ " }\n",
100
+ " }\n",
101
+ " }\n",
102
+ " });\n",
103
+ " // Destroy server and session\n",
104
+ " const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n",
105
+ " cell.notebook.kernel.execute(cmd_destroy);\n",
106
+ " }\n",
107
+ " }\n",
108
+ "\n",
109
+ " /**\n",
110
+ " * Handle when a new output is added\n",
111
+ " */\n",
112
+ " function handleAddOutput(event, handle) {\n",
113
+ " const output_area = handle.output_area;\n",
114
+ " const output = handle.output;\n",
115
+ "\n",
116
+ " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n",
117
+ " if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n",
118
+ " return\n",
119
+ " }\n",
120
+ "\n",
121
+ " const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n",
122
+ "\n",
123
+ " if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n",
124
+ " toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n",
125
+ " // store reference to embed id on output_area\n",
126
+ " output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n",
127
+ " }\n",
128
+ " if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n",
129
+ " const bk_div = document.createElement(\"div\");\n",
130
+ " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n",
131
+ " const script_attrs = bk_div.children[0].attributes;\n",
132
+ " for (let i = 0; i < script_attrs.length; i++) {\n",
133
+ " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n",
134
+ " toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n",
135
+ " }\n",
136
+ " // store reference to server id on output_area\n",
137
+ " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n",
138
+ " }\n",
139
+ " }\n",
140
+ "\n",
141
+ " function register_renderer(events, OutputArea) {\n",
142
+ "\n",
143
+ " function append_mime(data, metadata, element) {\n",
144
+ " // create a DOM node to render to\n",
145
+ " const toinsert = this.create_output_subarea(\n",
146
+ " metadata,\n",
147
+ " CLASS_NAME,\n",
148
+ " EXEC_MIME_TYPE\n",
149
+ " );\n",
150
+ " this.keyboard_manager.register_events(toinsert);\n",
151
+ " // Render to node\n",
152
+ " const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n",
153
+ " render(props, toinsert[toinsert.length - 1]);\n",
154
+ " element.append(toinsert);\n",
155
+ " return toinsert\n",
156
+ " }\n",
157
+ "\n",
158
+ " /* Handle when an output is cleared or removed */\n",
159
+ " events.on('clear_output.CodeCell', handleClearOutput);\n",
160
+ " events.on('delete.Cell', handleClearOutput);\n",
161
+ "\n",
162
+ " /* Handle when a new output is added */\n",
163
+ " events.on('output_added.OutputArea', handleAddOutput);\n",
164
+ "\n",
165
+ " /**\n",
166
+ " * Register the mime type and append_mime function with output_area\n",
167
+ " */\n",
168
+ " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n",
169
+ " /* Is output safe? */\n",
170
+ " safe: true,\n",
171
+ " /* Index of renderer in `output_area.display_order` */\n",
172
+ " index: 0\n",
173
+ " });\n",
174
+ " }\n",
175
+ "\n",
176
+ " // register the mime type if in Jupyter Notebook environment and previously unregistered\n",
177
+ " if (root.Jupyter !== undefined) {\n",
178
+ " const events = require('base/js/events');\n",
179
+ " const OutputArea = require('notebook/js/outputarea').OutputArea;\n",
180
+ "\n",
181
+ " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n",
182
+ " register_renderer(events, OutputArea);\n",
183
+ " }\n",
184
+ " }\n",
185
+ " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n",
186
+ " root._bokeh_timeout = Date.now() + 5000;\n",
187
+ " root._bokeh_failed_load = false;\n",
188
+ " }\n",
189
+ "\n",
190
+ " const NB_LOAD_WARNING = {'data': {'text/html':\n",
191
+ " \"<div style='background-color: #fdd'>\\n\"+\n",
192
+ " \"<p>\\n\"+\n",
193
+ " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n",
194
+ " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n",
195
+ " \"</p>\\n\"+\n",
196
+ " \"<ul>\\n\"+\n",
197
+ " \"<li>re-rerun `output_notebook()` to attempt to load from CDN again, or</li>\\n\"+\n",
198
+ " \"<li>use INLINE resources instead, as so:</li>\\n\"+\n",
199
+ " \"</ul>\\n\"+\n",
200
+ " \"<code>\\n\"+\n",
201
+ " \"from bokeh.resources import INLINE\\n\"+\n",
202
+ " \"output_notebook(resources=INLINE)\\n\"+\n",
203
+ " \"</code>\\n\"+\n",
204
+ " \"</div>\"}};\n",
205
+ "\n",
206
+ " function display_loaded() {\n",
207
+ " const el = document.getElementById(\"1002\");\n",
208
+ " if (el != null) {\n",
209
+ " el.textContent = \"BokehJS is loading...\";\n",
210
+ " }\n",
211
+ " if (root.Bokeh !== undefined) {\n",
212
+ " if (el != null) {\n",
213
+ " el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n",
214
+ " }\n",
215
+ " } else if (Date.now() < root._bokeh_timeout) {\n",
216
+ " setTimeout(display_loaded, 100)\n",
217
+ " }\n",
218
+ " }\n",
219
+ "\n",
220
+ " function run_callbacks() {\n",
221
+ " try {\n",
222
+ " root._bokeh_onload_callbacks.forEach(function(callback) {\n",
223
+ " if (callback != null)\n",
224
+ " callback();\n",
225
+ " });\n",
226
+ " } finally {\n",
227
+ " delete root._bokeh_onload_callbacks\n",
228
+ " }\n",
229
+ " console.debug(\"Bokeh: all callbacks have finished\");\n",
230
+ " }\n",
231
+ "\n",
232
+ " function load_libs(css_urls, js_urls, callback) {\n",
233
+ " if (css_urls == null) css_urls = [];\n",
234
+ " if (js_urls == null) js_urls = [];\n",
235
+ "\n",
236
+ " root._bokeh_onload_callbacks.push(callback);\n",
237
+ " if (root._bokeh_is_loading > 0) {\n",
238
+ " console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n",
239
+ " return null;\n",
240
+ " }\n",
241
+ " if (js_urls == null || js_urls.length === 0) {\n",
242
+ " run_callbacks();\n",
243
+ " return null;\n",
244
+ " }\n",
245
+ " console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n",
246
+ " root._bokeh_is_loading = css_urls.length + js_urls.length;\n",
247
+ "\n",
248
+ " function on_load() {\n",
249
+ " root._bokeh_is_loading--;\n",
250
+ " if (root._bokeh_is_loading === 0) {\n",
251
+ " console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n",
252
+ " run_callbacks()\n",
253
+ " }\n",
254
+ " }\n",
255
+ "\n",
256
+ " function on_error(url) {\n",
257
+ " console.error(\"failed to load \" + url);\n",
258
+ " }\n",
259
+ "\n",
260
+ " for (let i = 0; i < css_urls.length; i++) {\n",
261
+ " const url = css_urls[i];\n",
262
+ " const element = document.createElement(\"link\");\n",
263
+ " element.onload = on_load;\n",
264
+ " element.onerror = on_error.bind(null, url);\n",
265
+ " element.rel = \"stylesheet\";\n",
266
+ " element.type = \"text/css\";\n",
267
+ " element.href = url;\n",
268
+ " console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n",
269
+ " document.body.appendChild(element);\n",
270
+ " }\n",
271
+ "\n",
272
+ " for (let i = 0; i < js_urls.length; i++) {\n",
273
+ " const url = js_urls[i];\n",
274
+ " const element = document.createElement('script');\n",
275
+ " element.onload = on_load;\n",
276
+ " element.onerror = on_error.bind(null, url);\n",
277
+ " element.async = false;\n",
278
+ " element.src = url;\n",
279
+ " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n",
280
+ " document.head.appendChild(element);\n",
281
+ " }\n",
282
+ " };\n",
283
+ "\n",
284
+ " function inject_raw_css(css) {\n",
285
+ " const element = document.createElement(\"style\");\n",
286
+ " element.appendChild(document.createTextNode(css));\n",
287
+ " document.body.appendChild(element);\n",
288
+ " }\n",
289
+ "\n",
290
+ " const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-2.4.3.min.js\"];\n",
291
+ " const css_urls = [];\n",
292
+ "\n",
293
+ " const inline_js = [ function(Bokeh) {\n",
294
+ " Bokeh.set_log_level(\"info\");\n",
295
+ " },\n",
296
+ "function(Bokeh) {\n",
297
+ " }\n",
298
+ " ];\n",
299
+ "\n",
300
+ " function run_inline_js() {\n",
301
+ " if (root.Bokeh !== undefined || force === true) {\n",
302
+ " for (let i = 0; i < inline_js.length; i++) {\n",
303
+ " inline_js[i].call(root, root.Bokeh);\n",
304
+ " }\n",
305
+ "if (force === true) {\n",
306
+ " display_loaded();\n",
307
+ " }} else if (Date.now() < root._bokeh_timeout) {\n",
308
+ " setTimeout(run_inline_js, 100);\n",
309
+ " } else if (!root._bokeh_failed_load) {\n",
310
+ " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n",
311
+ " root._bokeh_failed_load = true;\n",
312
+ " } else if (force !== true) {\n",
313
+ " const cell = $(document.getElementById(\"1002\")).parents('.cell').data().cell;\n",
314
+ " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n",
315
+ " }\n",
316
+ " }\n",
317
+ "\n",
318
+ " if (root._bokeh_is_loading === 0) {\n",
319
+ " console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n",
320
+ " run_inline_js();\n",
321
+ " } else {\n",
322
+ " load_libs(css_urls, js_urls, function() {\n",
323
+ " console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n",
324
+ " run_inline_js();\n",
325
+ " });\n",
326
+ " }\n",
327
+ "}(window));"
328
+ ],
329
+ "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 \"<div style='background-color: #fdd'>\\n\"+\n \"<p>\\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 \"</p>\\n\"+\n \"<ul>\\n\"+\n \"<li>re-rerun `output_notebook()` to attempt to load from CDN again, or</li>\\n\"+\n \"<li>use INLINE resources instead, as so:</li>\\n\"+\n \"</ul>\\n\"+\n \"<code>\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"</code>\\n\"+\n \"</div>\"}};\n\n function display_loaded() {\n const el = document.getElementById(\"1002\");\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-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-2.4.3.min.js\"];\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(\"1002\")).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));"
330
+ },
331
+ "metadata": {},
332
+ "output_type": "display_data"
333
+ }
334
+ ],
335
+ "source": [
336
+ "#nbi:hide_out\n",
337
+ "# Make all outputs INLINE for default (why a hell this is needed !!!)\n",
338
+ "output_notebook()"
339
+ ]
340
+ },
341
+ {
342
+ "cell_type": "markdown",
343
+ "metadata": {},
344
+ "source": [
345
+ "### Linked Interactions\n",
346
+ "\n",
347
+ "It is possible to link various interactions between different Bokeh plots. For instance, the ranges of two (or more) plots can be linked, so that when one of the plots is panned (or zoomed, or otherwise has its range changed) the other plots will update in unison. It is also possible to link selections between two plots, so that when items are selected on one plot, the corresponding items on the second plot also become selected. "
348
+ ]
349
+ },
350
+ {
351
+ "cell_type": "markdown",
352
+ "metadata": {},
353
+ "source": [
354
+ "#### Linked panning\n",
355
+ "\n",
356
+ "Linked panning (when multiple plots have ranges that stay in sync) is simple to spell with Bokeh. You simply share the appropriate range objects between two (or more) plots. The example below shows how to accomplish this by linking the ranges of three plots in various ways:"
357
+ ]
358
+ },
359
+ {
360
+ "cell_type": "code",
361
+ "execution_count": 3,
362
+ "metadata": {},
363
+ "outputs": [],
364
+ "source": [
365
+ "# from bokeh.layouts import gridplot"
366
+ ]
367
+ },
368
+ {
369
+ "cell_type": "code",
370
+ "execution_count": 4,
371
+ "metadata": {},
372
+ "outputs": [
373
+ {
374
+ "data": {
375
+ "text/html": [
376
+ "\n",
377
+ " <div class=\"bk-root\" id=\"dea48465-4c90-4222-8bb4-9a415c63c2bd\" data-root-id=\"1126\"></div>\n"
378
+ ]
379
+ },
380
+ "metadata": {},
381
+ "output_type": "display_data"
382
+ },
383
+ {
384
+ "data": {
385
+ "application/javascript": [
386
+ "(function(root) {\n",
387
+ " function embed_document(root) {\n",
388
+ " const docs_json = {\"d825342f-7cc0-4916-9205-708a0e5f1663\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"children\":[{\"id\":\"1125\"},{\"id\":\"1123\"}]},\"id\":\"1126\",\"type\":\"Column\"},{\"attributes\":{},\"id\":\"1036\",\"type\":\"LinearScale\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"navy\"},\"hatch_alpha\":{\"value\":0.1},\"hatch_color\":{\"value\":\"navy\"},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"navy\"},\"size\":{\"value\":10},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1029\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1006\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1004\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1013\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1008\",\"type\":\"LinearScale\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1104\"},\"group\":null,\"major_label_policy\":{\"id\":\"1105\"},\"ticker\":{\"id\":\"1045\"}},\"id\":\"1044\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1010\",\"type\":\"LinearScale\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1096\"},\"group\":null,\"major_label_policy\":{\"id\":\"1097\"},\"ticker\":{\"id\":\"1013\"}},\"id\":\"1012\",\"type\":\"LinearAxis\"},{\"attributes\":{\"axis\":{\"id\":\"1012\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1015\",\"type\":\"Grid\"},{\"attributes\":{\"source\":{\"id\":\"1027\"}},\"id\":\"1032\",\"type\":\"CDSView\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1027\"},\"glyph\":{\"id\":\"1028\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1030\"},\"nonselection_glyph\":{\"id\":\"1029\"},\"view\":{\"id\":\"1032\"}},\"id\":\"1031\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1017\",\"type\":\"BasicTicker\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1093\"},\"group\":null,\"major_label_policy\":{\"id\":\"1094\"},\"ticker\":{\"id\":\"1017\"}},\"id\":\"1016\",\"type\":\"LinearAxis\"},{\"attributes\":{\"tools\":[{\"id\":\"1020\"},{\"id\":\"1021\"},{\"id\":\"1022\"}]},\"id\":\"1023\",\"type\":\"Toolbar\"},{\"attributes\":{\"axis\":{\"id\":\"1016\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1019\",\"type\":\"Grid\"},{\"attributes\":{\"data\":{\"x\":[0,1,2,3,4,5,6,7,8,9,10],\"y\":[0,1,2,3,4,5,6,7,8,9,10]},\"selected\":{\"id\":\"1099\"},\"selection_policy\":{\"id\":\"1098\"}},\"id\":\"1027\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"below\":[{\"id\":\"1069\"}],\"center\":[{\"id\":\"1072\"},{\"id\":\"1076\"}],\"height\":250,\"left\":[{\"id\":\"1073\"}],\"renderers\":[{\"id\":\"1088\"}],\"title\":{\"id\":\"1112\"},\"toolbar\":{\"id\":\"1080\"},\"toolbar_location\":null,\"width\":250,\"x_range\":{\"id\":\"1004\"},\"x_scale\":{\"id\":\"1065\"},\"y_range\":{\"id\":\"1063\"},\"y_scale\":{\"id\":\"1067\"}},\"id\":\"1061\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"1020\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"1021\",\"type\":\"WheelZoomTool\"},{\"attributes\":{},\"id\":\"1022\",\"type\":\"ResetTool\"},{\"attributes\":{\"data\":{\"x\":[0,1,2,3,4,5,6,7,8,9,10],\"y\":[10,9,8,7,6,5,4,3,2,1,0]},\"selected\":{\"id\":\"1110\"},\"selection_policy\":{\"id\":\"1109\"}},\"id\":\"1055\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"axis\":{\"id\":\"1040\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1043\",\"type\":\"Grid\"},{\"attributes\":{\"axis\":{\"id\":\"1044\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1047\",\"type\":\"Grid\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1107\"},\"group\":null,\"major_label_policy\":{\"id\":\"1108\"},\"ticker\":{\"id\":\"1041\"}},\"id\":\"1040\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1048\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"1041\",\"type\":\"BasicTicker\"},{\"attributes\":{\"tools\":[{\"id\":\"1048\"},{\"id\":\"1049\"},{\"id\":\"1050\"}]},\"id\":\"1051\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"1049\",\"type\":\"WheelZoomTool\"},{\"attributes\":{},\"id\":\"1050\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"1038\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1045\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1096\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"coordinates\":null,\"group\":null},\"id\":\"1090\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1093\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1097\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1094\",\"type\":\"AllLabels\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"navy\"},\"hatch_alpha\":{\"value\":0.2},\"hatch_color\":{\"value\":\"navy\"},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"navy\"},\"size\":{\"value\":10},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1030\",\"type\":\"Circle\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"firebrick\"},\"hatch_alpha\":{\"value\":0.2},\"hatch_color\":{\"value\":\"firebrick\"},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"firebrick\"},\"marker\":{\"value\":\"triangle\"},\"size\":{\"value\":10},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1058\",\"type\":\"Scatter\"},{\"attributes\":{},\"id\":\"1099\",\"type\":\"Selection\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1084\"},\"glyph\":{\"id\":\"1085\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1087\"},\"nonselection_glyph\":{\"id\":\"1086\"},\"view\":{\"id\":\"1089\"}},\"id\":\"1088\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"source\":{\"id\":\"1055\"}},\"id\":\"1060\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1098\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"fill_color\":{\"value\":\"firebrick\"},\"hatch_color\":{\"value\":\"firebrick\"},\"line_color\":{\"value\":\"firebrick\"},\"marker\":{\"value\":\"triangle\"},\"size\":{\"value\":10},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1056\",\"type\":\"Scatter\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"firebrick\"},\"hatch_alpha\":{\"value\":0.1},\"hatch_color\":{\"value\":\"firebrick\"},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"firebrick\"},\"marker\":{\"value\":\"triangle\"},\"size\":{\"value\":10},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1057\",\"type\":\"Scatter\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1055\"},\"glyph\":{\"id\":\"1056\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1058\"},\"nonselection_glyph\":{\"id\":\"1057\"},\"view\":{\"id\":\"1060\"}},\"id\":\"1059\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1063\",\"type\":\"DataRange1d\"},{\"attributes\":{\"fill_color\":{\"value\":\"navy\"},\"hatch_color\":{\"value\":\"navy\"},\"line_color\":{\"value\":\"navy\"},\"size\":{\"value\":10},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1028\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1070\",\"type\":\"BasicTicker\"},{\"attributes\":{\"coordinates\":null,\"group\":null},\"id\":\"1101\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1065\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1107\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1104\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"below\":[{\"id\":\"1040\"}],\"center\":[{\"id\":\"1043\"},{\"id\":\"1047\"}],\"height\":250,\"left\":[{\"id\":\"1044\"}],\"renderers\":[{\"id\":\"1059\"}],\"title\":{\"id\":\"1101\"},\"toolbar\":{\"id\":\"1051\"},\"toolbar_location\":null,\"width\":250,\"x_range\":{\"id\":\"1004\"},\"x_scale\":{\"id\":\"1036\"},\"y_range\":{\"id\":\"1006\"},\"y_scale\":{\"id\":\"1038\"}},\"id\":\"1033\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"1067\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1108\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1105\",\"type\":\"AllLabels\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1118\"},\"group\":null,\"major_label_policy\":{\"id\":\"1119\"},\"ticker\":{\"id\":\"1070\"}},\"id\":\"1069\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1109\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"axis\":{\"id\":\"1069\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1072\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1074\",\"type\":\"BasicTicker\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1115\"},\"group\":null,\"major_label_policy\":{\"id\":\"1116\"},\"ticker\":{\"id\":\"1074\"}},\"id\":\"1073\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1110\",\"type\":\"Selection\"},{\"attributes\":{\"coordinates\":null,\"group\":null},\"id\":\"1112\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1118\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"axis\":{\"id\":\"1073\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1076\",\"type\":\"Grid\"},{\"attributes\":{\"data\":{\"x\":[0,1,2,3,4,5,6,7,8,9,10],\"y\":[5,4,3,2,1,0,1,2,3,4,5]},\"selected\":{\"id\":\"1121\"},\"selection_policy\":{\"id\":\"1120\"}},\"id\":\"1084\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1115\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"children\":[[{\"id\":\"1003\"},0,0],[{\"id\":\"1033\"},0,1],[{\"id\":\"1061\"},0,2]]},\"id\":\"1123\",\"type\":\"GridBox\"},{\"attributes\":{\"tools\":[{\"id\":\"1077\"},{\"id\":\"1078\"},{\"id\":\"1079\"}]},\"id\":\"1080\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"1119\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1077\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"1116\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1078\",\"type\":\"WheelZoomTool\"},{\"attributes\":{},\"id\":\"1120\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1079\",\"type\":\"ResetTool\"},{\"attributes\":{\"source\":{\"id\":\"1084\"}},\"id\":\"1089\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1121\",\"type\":\"Selection\"},{\"attributes\":{\"toolbar\":{\"id\":\"1124\"},\"toolbar_location\":\"above\"},\"id\":\"1125\",\"type\":\"ToolbarBox\"},{\"attributes\":{\"toolbars\":[{\"id\":\"1023\"},{\"id\":\"1051\"},{\"id\":\"1080\"}],\"tools\":[{\"id\":\"1020\"},{\"id\":\"1021\"},{\"id\":\"1022\"},{\"id\":\"1048\"},{\"id\":\"1049\"},{\"id\":\"1050\"},{\"id\":\"1077\"},{\"id\":\"1078\"},{\"id\":\"1079\"}]},\"id\":\"1124\",\"type\":\"ProxyToolbar\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"olive\"},\"hatch_alpha\":{\"value\":0.1},\"hatch_color\":{\"value\":\"olive\"},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"olive\"},\"marker\":{\"value\":\"square\"},\"size\":{\"value\":10},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1086\",\"type\":\"Scatter\"},{\"attributes\":{\"below\":[{\"id\":\"1012\"}],\"center\":[{\"id\":\"1015\"},{\"id\":\"1019\"}],\"height\":250,\"left\":[{\"id\":\"1016\"}],\"renderers\":[{\"id\":\"1031\"}],\"title\":{\"id\":\"1090\"},\"toolbar\":{\"id\":\"1023\"},\"toolbar_location\":null,\"width\":250,\"x_range\":{\"id\":\"1004\"},\"x_scale\":{\"id\":\"1008\"},\"y_range\":{\"id\":\"1006\"},\"y_scale\":{\"id\":\"1010\"}},\"id\":\"1003\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"olive\"},\"hatch_alpha\":{\"value\":0.2},\"hatch_color\":{\"value\":\"olive\"},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"olive\"},\"marker\":{\"value\":\"square\"},\"size\":{\"value\":10},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1087\",\"type\":\"Scatter\"},{\"attributes\":{\"fill_color\":{\"value\":\"olive\"},\"hatch_color\":{\"value\":\"olive\"},\"line_color\":{\"value\":\"olive\"},\"marker\":{\"value\":\"square\"},\"size\":{\"value\":10},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1085\",\"type\":\"Scatter\"}],\"root_ids\":[\"1126\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n",
389
+ " const render_items = [{\"docid\":\"d825342f-7cc0-4916-9205-708a0e5f1663\",\"root_ids\":[\"1126\"],\"roots\":{\"1126\":\"dea48465-4c90-4222-8bb4-9a415c63c2bd\"}}];\n",
390
+ " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
391
+ " }\n",
392
+ " if (root.Bokeh !== undefined) {\n",
393
+ " embed_document(root);\n",
394
+ " } else {\n",
395
+ " let attempts = 0;\n",
396
+ " const timer = setInterval(function(root) {\n",
397
+ " if (root.Bokeh !== undefined) {\n",
398
+ " clearInterval(timer);\n",
399
+ " embed_document(root);\n",
400
+ " } else {\n",
401
+ " attempts++;\n",
402
+ " if (attempts > 100) {\n",
403
+ " clearInterval(timer);\n",
404
+ " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
405
+ " }\n",
406
+ " }\n",
407
+ " }, 10, root)\n",
408
+ " }\n",
409
+ "})(window);"
410
+ ],
411
+ "application/vnd.bokehjs_exec.v0+json": ""
412
+ },
413
+ "metadata": {
414
+ "application/vnd.bokehjs_exec.v0+json": {
415
+ "id": "1126"
416
+ }
417
+ },
418
+ "output_type": "display_data"
419
+ }
420
+ ],
421
+ "source": [
422
+ "x = list(range(11))\n",
423
+ "y0, y1, y2 = x, [10-i for i in x], [abs(i-5) for i in x]\n",
424
+ "\n",
425
+ "plot_options = dict(\n",
426
+ " width=250,\n",
427
+ " plot_height=250,\n",
428
+ " tools='pan, wheel_zoom, reset'\n",
429
+ ")\n",
430
+ "\n",
431
+ "# create a new plot\n",
432
+ "s1 = figure(**plot_options)\n",
433
+ "s1.circle(x, y0, size=10, color=\"navy\")\n",
434
+ "\n",
435
+ "# create a new plot and share both ranges\n",
436
+ "s2 = figure(\n",
437
+ " x_range=s1.x_range,\n",
438
+ " y_range=s1.y_range,\n",
439
+ " **plot_options\n",
440
+ ")\n",
441
+ "s2.triangle(\n",
442
+ " x,\n",
443
+ " y1,\n",
444
+ " size=10,\n",
445
+ " color=\"firebrick\"\n",
446
+ ")\n",
447
+ "\n",
448
+ "# create a new plot and share only one range\n",
449
+ "s3 = figure(\n",
450
+ " x_range=s1.x_range,\n",
451
+ " **plot_options\n",
452
+ ")\n",
453
+ "s3.square(\n",
454
+ " x,\n",
455
+ " y2,\n",
456
+ " size=10,\n",
457
+ " color=\"olive\"\n",
458
+ ")\n",
459
+ "\n",
460
+ "p = gridplot(\n",
461
+ " [[s1, s2, s3]]\n",
462
+ ")\n",
463
+ "\n",
464
+ "# show the results\n",
465
+ "show(p)"
466
+ ]
467
+ },
468
+ {
469
+ "cell_type": "markdown",
470
+ "metadata": {},
471
+ "source": [
472
+ "#### Linked brushing\n",
473
+ "\n",
474
+ "Linking selections is accomplished in a similar way, by sharing data sources between plots. Note that normally with ``bokeh.plotting`` and ``bokeh.charts`` creating a default data source for simple plots is handled automatically. However to share a data source, we must create them by hand and pass them explicitly. This is illustrated in the example below:"
475
+ ]
476
+ },
477
+ {
478
+ "cell_type": "code",
479
+ "execution_count": 5,
480
+ "metadata": {},
481
+ "outputs": [],
482
+ "source": [
483
+ "# from bokeh.models import ColumnDataSource"
484
+ ]
485
+ },
486
+ {
487
+ "cell_type": "code",
488
+ "execution_count": 6,
489
+ "metadata": {},
490
+ "outputs": [
491
+ {
492
+ "data": {
493
+ "text/html": [
494
+ "\n",
495
+ " <div class=\"bk-root\" id=\"a39f2525-b7cf-4c2d-9b9c-7e51f80927c6\" data-root-id=\"1405\"></div>\n"
496
+ ]
497
+ },
498
+ "metadata": {},
499
+ "output_type": "display_data"
500
+ },
501
+ {
502
+ "data": {
503
+ "application/javascript": [
504
+ "(function(root) {\n",
505
+ " function embed_document(root) {\n",
506
+ " const docs_json = {\"13b44cb4-e313-4d31-b4b5-d42363780634\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"children\":[{\"id\":\"1404\"},{\"id\":\"1402\"}]},\"id\":\"1405\",\"type\":\"Column\"},{\"attributes\":{},\"id\":\"1343\",\"type\":\"DataRange1d\"},{\"attributes\":{\"axis\":{\"id\":\"1351\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1354\",\"type\":\"Grid\"},{\"attributes\":{\"coordinates\":null,\"fill_alpha\":0.5,\"fill_color\":\"lightgrey\",\"group\":null,\"level\":\"overlay\",\"line_alpha\":1.0,\"line_color\":\"black\",\"line_dash\":[4,4],\"line_width\":2,\"syncable\":false,\"xs_units\":\"screen\",\"ys_units\":\"screen\"},\"id\":\"1364\",\"type\":\"PolyAnnotation\"},{\"attributes\":{},\"id\":\"1318\",\"type\":\"BasicTicker\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1307\"},\"glyph\":{\"id\":\"1337\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1339\"},\"nonselection_glyph\":{\"id\":\"1338\"},\"view\":{\"id\":\"1341\"}},\"id\":\"1340\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1356\",\"type\":\"BasicTicker\"},{\"attributes\":{\"toolbar\":{\"id\":\"1403\"},\"toolbar_location\":\"above\"},\"id\":\"1404\",\"type\":\"ToolbarBox\"},{\"attributes\":{},\"id\":\"1345\",\"type\":\"DataRange1d\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1392\"},\"group\":null,\"major_label_policy\":{\"id\":\"1393\"},\"ticker\":{\"id\":\"1356\"}},\"id\":\"1355\",\"type\":\"LinearAxis\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"#1f77b4\"},\"hatch_alpha\":{\"value\":0.2},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"#1f77b4\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y1\"}},\"id\":\"1373\",\"type\":\"Circle\"},{\"attributes\":{\"source\":{\"id\":\"1307\"}},\"id\":\"1375\",\"type\":\"CDSView\"},{\"attributes\":{\"bottom_units\":\"screen\",\"coordinates\":null,\"fill_alpha\":0.5,\"fill_color\":\"lightgrey\",\"group\":null,\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":1.0,\"line_color\":\"black\",\"line_dash\":[4,4],\"line_width\":2,\"right_units\":\"screen\",\"syncable\":false,\"top_units\":\"screen\"},\"id\":\"1329\",\"type\":\"BoxAnnotation\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"#1f77b4\"},\"hatch_alpha\":{\"value\":0.2},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"#1f77b4\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y0\"}},\"id\":\"1339\",\"type\":\"Circle\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1382\"},\"group\":null,\"major_label_policy\":{\"id\":\"1383\"},\"ticker\":{\"id\":\"1318\"}},\"id\":\"1317\",\"type\":\"LinearAxis\"},{\"attributes\":{\"axis\":{\"id\":\"1355\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1358\",\"type\":\"Grid\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"#1f77b4\"},\"hatch_alpha\":{\"value\":0.1},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#1f77b4\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y1\"}},\"id\":\"1372\",\"type\":\"Circle\"},{\"attributes\":{\"axis\":{\"id\":\"1317\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1320\",\"type\":\"Grid\"},{\"attributes\":{\"coordinates\":null,\"group\":null},\"id\":\"1389\",\"type\":\"Title\"},{\"attributes\":{\"children\":[[{\"id\":\"1308\"},0,0],[{\"id\":\"1342\"},0,1]]},\"id\":\"1402\",\"type\":\"GridBox\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1307\"},\"glyph\":{\"id\":\"1371\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1373\"},\"nonselection_glyph\":{\"id\":\"1372\"},\"view\":{\"id\":\"1375\"}},\"id\":\"1374\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1322\",\"type\":\"BasicTicker\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1379\"},\"group\":null,\"major_label_policy\":{\"id\":\"1380\"},\"ticker\":{\"id\":\"1322\"}},\"id\":\"1321\",\"type\":\"LinearAxis\"},{\"attributes\":{\"tools\":[{\"id\":\"1359\"},{\"id\":\"1360\"},{\"id\":\"1361\"},{\"id\":\"1362\"}]},\"id\":\"1365\",\"type\":\"Toolbar\"},{\"attributes\":{\"overlay\":{\"id\":\"1363\"}},\"id\":\"1359\",\"type\":\"BoxSelectTool\"},{\"attributes\":{\"fill_color\":{\"value\":\"#1f77b4\"},\"line_color\":{\"value\":\"#1f77b4\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y0\"}},\"id\":\"1337\",\"type\":\"Circle\"},{\"attributes\":{\"overlay\":{\"id\":\"1364\"}},\"id\":\"1360\",\"type\":\"LassoSelectTool\"},{\"attributes\":{},\"id\":\"1392\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1361\",\"type\":\"HelpTool\"},{\"attributes\":{},\"id\":\"1362\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"1396\",\"type\":\"AllLabels\"},{\"attributes\":{\"axis\":{\"id\":\"1321\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1324\",\"type\":\"Grid\"},{\"attributes\":{\"coordinates\":null,\"fill_alpha\":0.5,\"fill_color\":\"lightgrey\",\"group\":null,\"level\":\"overlay\",\"line_alpha\":1.0,\"line_color\":\"black\",\"line_dash\":[4,4],\"line_width\":2,\"syncable\":false,\"xs_units\":\"screen\",\"ys_units\":\"screen\"},\"id\":\"1330\",\"type\":\"PolyAnnotation\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"#1f77b4\"},\"hatch_alpha\":{\"value\":0.1},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#1f77b4\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y0\"}},\"id\":\"1338\",\"type\":\"Circle\"},{\"attributes\":{\"coordinates\":null,\"group\":null},\"id\":\"1376\",\"type\":\"Title\"},{\"attributes\":{\"data\":{\"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]},\"selected\":{\"id\":\"1385\"},\"selection_policy\":{\"id\":\"1384\"}},\"id\":\"1307\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"tools\":[{\"id\":\"1325\"},{\"id\":\"1326\"},{\"id\":\"1327\"},{\"id\":\"1328\"}]},\"id\":\"1331\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"1347\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1380\",\"type\":\"AllLabels\"},{\"attributes\":{\"toolbars\":[{\"id\":\"1331\"},{\"id\":\"1365\"}],\"tools\":[{\"id\":\"1325\"},{\"id\":\"1326\"},{\"id\":\"1327\"},{\"id\":\"1328\"},{\"id\":\"1359\"},{\"id\":\"1360\"},{\"id\":\"1361\"},{\"id\":\"1362\"}]},\"id\":\"1403\",\"type\":\"ProxyToolbar\"},{\"attributes\":{\"below\":[{\"id\":\"1351\"}],\"center\":[{\"id\":\"1354\"},{\"id\":\"1358\"}],\"height\":300,\"left\":[{\"id\":\"1355\"}],\"renderers\":[{\"id\":\"1374\"}],\"title\":{\"id\":\"1389\"},\"toolbar\":{\"id\":\"1365\"},\"toolbar_location\":null,\"width\":400,\"x_range\":{\"id\":\"1343\"},\"x_scale\":{\"id\":\"1347\"},\"y_range\":{\"id\":\"1345\"},\"y_scale\":{\"id\":\"1349\"}},\"id\":\"1342\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"1382\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1352\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1311\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1379\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1395\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"overlay\":{\"id\":\"1329\"}},\"id\":\"1325\",\"type\":\"BoxSelectTool\"},{\"attributes\":{},\"id\":\"1315\",\"type\":\"LinearScale\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1395\"},\"group\":null,\"major_label_policy\":{\"id\":\"1396\"},\"ticker\":{\"id\":\"1352\"}},\"id\":\"1351\",\"type\":\"LinearAxis\"},{\"attributes\":{\"overlay\":{\"id\":\"1330\"}},\"id\":\"1326\",\"type\":\"LassoSelectTool\"},{\"attributes\":{},\"id\":\"1383\",\"type\":\"AllLabels\"},{\"attributes\":{\"below\":[{\"id\":\"1317\"}],\"center\":[{\"id\":\"1320\"},{\"id\":\"1324\"}],\"height\":300,\"left\":[{\"id\":\"1321\"}],\"renderers\":[{\"id\":\"1340\"}],\"title\":{\"id\":\"1376\"},\"toolbar\":{\"id\":\"1331\"},\"toolbar_location\":null,\"width\":400,\"x_range\":{\"id\":\"1309\"},\"x_scale\":{\"id\":\"1313\"},\"y_range\":{\"id\":\"1311\"},\"y_scale\":{\"id\":\"1315\"}},\"id\":\"1308\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"1327\",\"type\":\"HelpTool\"},{\"attributes\":{},\"id\":\"1393\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1328\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"1349\",\"type\":\"LinearScale\"},{\"attributes\":{\"bottom_units\":\"screen\",\"coordinates\":null,\"fill_alpha\":0.5,\"fill_color\":\"lightgrey\",\"group\":null,\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":1.0,\"line_color\":\"black\",\"line_dash\":[4,4],\"line_width\":2,\"right_units\":\"screen\",\"syncable\":false,\"top_units\":\"screen\"},\"id\":\"1363\",\"type\":\"BoxAnnotation\"},{\"attributes\":{},\"id\":\"1384\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1309\",\"type\":\"DataRange1d\"},{\"attributes\":{\"fill_color\":{\"value\":\"#1f77b4\"},\"line_color\":{\"value\":\"#1f77b4\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y1\"}},\"id\":\"1371\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1385\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1313\",\"type\":\"LinearScale\"},{\"attributes\":{\"source\":{\"id\":\"1307\"}},\"id\":\"1341\",\"type\":\"CDSView\"}],\"root_ids\":[\"1405\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n",
507
+ " const render_items = [{\"docid\":\"13b44cb4-e313-4d31-b4b5-d42363780634\",\"root_ids\":[\"1405\"],\"roots\":{\"1405\":\"a39f2525-b7cf-4c2d-9b9c-7e51f80927c6\"}}];\n",
508
+ " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
509
+ " }\n",
510
+ " if (root.Bokeh !== undefined) {\n",
511
+ " embed_document(root);\n",
512
+ " } else {\n",
513
+ " let attempts = 0;\n",
514
+ " const timer = setInterval(function(root) {\n",
515
+ " if (root.Bokeh !== undefined) {\n",
516
+ " clearInterval(timer);\n",
517
+ " embed_document(root);\n",
518
+ " } else {\n",
519
+ " attempts++;\n",
520
+ " if (attempts > 100) {\n",
521
+ " clearInterval(timer);\n",
522
+ " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
523
+ " }\n",
524
+ " }\n",
525
+ " }, 10, root)\n",
526
+ " }\n",
527
+ "})(window);"
528
+ ],
529
+ "application/vnd.bokehjs_exec.v0+json": ""
530
+ },
531
+ "metadata": {
532
+ "application/vnd.bokehjs_exec.v0+json": {
533
+ "id": "1405"
534
+ }
535
+ },
536
+ "output_type": "display_data"
537
+ }
538
+ ],
539
+ "source": [
540
+ "x = list(range(-20, 21))\n",
541
+ "y0, y1 = [abs(xx) for xx in x], [xx**2 for xx in x]\n",
542
+ "\n",
543
+ "# create a column data source for the plots to share\n",
544
+ "source = ColumnDataSource(\n",
545
+ " data=dict(\n",
546
+ " x=x,\n",
547
+ " y0=y0,\n",
548
+ " y1=y1\n",
549
+ " )\n",
550
+ ")\n",
551
+ "\n",
552
+ "TOOLS = \"box_select, lasso_select, help, reset\"\n",
553
+ "\n",
554
+ "# create a new plot and add a renderer\n",
555
+ "left = figure(\n",
556
+ " width=400,\n",
557
+ " height=300,\n",
558
+ " tools=TOOLS\n",
559
+ ")\n",
560
+ "left.circle(\n",
561
+ " 'x',\n",
562
+ " 'y0',\n",
563
+ " source=source\n",
564
+ ")\n",
565
+ "\n",
566
+ "# create another new plot and add a renderer\n",
567
+ "right = figure(\n",
568
+ " width=400,\n",
569
+ " height=300,\n",
570
+ " tools=TOOLS\n",
571
+ ")\n",
572
+ "right.circle(\n",
573
+ " 'x',\n",
574
+ " 'y1',\n",
575
+ " source=source\n",
576
+ ")\n",
577
+ "\n",
578
+ "p = gridplot(\n",
579
+ " [[left, right]]\n",
580
+ ")\n",
581
+ "\n",
582
+ "# show the results\n",
583
+ "show(p)"
584
+ ]
585
+ },
586
+ {
587
+ "cell_type": "markdown",
588
+ "metadata": {},
589
+ "source": [
590
+ "### Hover Tools\n",
591
+ "\n",
592
+ "Bokeh has a Hover Tool that allows additional information to be displayed in a popup whenever the user hovers over a specific glyph. Basic hover tool configuration amounts to providing a list of ``(name, format)`` tuples. The full details can be found in the User's Guide [here](https://bokeh.pydata.org/en/latest/docs/user_guide/tools.html#hovertool). \n",
593
+ "The example below shows some basic usage of the Hover tool with a circle glyph, using hover information defined in utils.py:"
594
+ ]
595
+ },
596
+ {
597
+ "cell_type": "code",
598
+ "execution_count": 7,
599
+ "metadata": {},
600
+ "outputs": [],
601
+ "source": [
602
+ "# from bokeh.models import HoverTool"
603
+ ]
604
+ },
605
+ {
606
+ "cell_type": "code",
607
+ "execution_count": 8,
608
+ "metadata": {},
609
+ "outputs": [
610
+ {
611
+ "data": {
612
+ "text/html": [
613
+ "\n",
614
+ " <div class=\"bk-root\" id=\"6afd60b2-b789-425f-92a6-4c59e21b2072\" data-root-id=\"1570\"></div>\n"
615
+ ]
616
+ },
617
+ "metadata": {},
618
+ "output_type": "display_data"
619
+ },
620
+ {
621
+ "data": {
622
+ "application/javascript": [
623
+ "(function(root) {\n",
624
+ " function embed_document(root) {\n",
625
+ " const docs_json = {\"d4fdf893-9158-44a8-a541-19e39f8f830f\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1581\"}],\"center\":[{\"id\":\"1584\"},{\"id\":\"1588\"}],\"height\":300,\"left\":[{\"id\":\"1585\"}],\"renderers\":[{\"id\":\"1595\"}],\"title\":{\"id\":\"1571\"},\"toolbar\":{\"id\":\"1589\"},\"width\":800,\"x_range\":{\"id\":\"1573\"},\"x_scale\":{\"id\":\"1577\"},\"y_range\":{\"id\":\"1575\"},\"y_scale\":{\"id\":\"1579\"}},\"id\":\"1570\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1651\"},\"group\":null,\"major_label_policy\":{\"id\":\"1652\"},\"ticker\":{\"id\":\"1586\"}},\"id\":\"1585\",\"type\":\"LinearAxis\"},{\"attributes\":{\"callback\":null,\"tooltips\":[[\"index\",\"$index\"],[\"(x,y)\",\"($x, $y)\"],[\"desc\",\"@desc\"]]},\"id\":\"1569\",\"type\":\"HoverTool\"},{\"attributes\":{\"data\":{\"desc\":[\"A\",\"b\",\"C\",\"d\",\"E\"],\"x\":[1,2,3,4,5],\"y\":[2,5,8,2,7]},\"selected\":{\"id\":\"1657\"},\"selection_policy\":{\"id\":\"1656\"}},\"id\":\"1568\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1651\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"axis\":{\"id\":\"1585\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1588\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1573\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1656\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1652\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1654\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1657\",\"type\":\"Selection\"},{\"attributes\":{\"tools\":[{\"id\":\"1569\"}]},\"id\":\"1589\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"1575\",\"type\":\"DataRange1d\"},{\"attributes\":{\"coordinates\":null,\"group\":null,\"text\":\"Mouse over the dots\"},\"id\":\"1571\",\"type\":\"Title\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"#1f77b4\"},\"hatch_alpha\":{\"value\":0.1},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#1f77b4\"},\"size\":{\"value\":20},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1593\",\"type\":\"Circle\"},{\"attributes\":{\"fill_color\":{\"value\":\"#1f77b4\"},\"line_color\":{\"value\":\"#1f77b4\"},\"size\":{\"value\":20},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1592\",\"type\":\"Circle\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"#1f77b4\"},\"hatch_alpha\":{\"value\":0.2},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"#1f77b4\"},\"size\":{\"value\":20},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1594\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1582\",\"type\":\"BasicTicker\"},{\"attributes\":{\"source\":{\"id\":\"1568\"}},\"id\":\"1596\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1577\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1579\",\"type\":\"LinearScale\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1568\"},\"glyph\":{\"id\":\"1592\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1594\"},\"nonselection_glyph\":{\"id\":\"1593\"},\"view\":{\"id\":\"1596\"}},\"id\":\"1595\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1654\"},\"group\":null,\"major_label_policy\":{\"id\":\"1655\"},\"ticker\":{\"id\":\"1582\"}},\"id\":\"1581\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1655\",\"type\":\"AllLabels\"},{\"attributes\":{\"axis\":{\"id\":\"1581\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1584\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1586\",\"type\":\"BasicTicker\"}],\"root_ids\":[\"1570\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n",
626
+ " const render_items = [{\"docid\":\"d4fdf893-9158-44a8-a541-19e39f8f830f\",\"root_ids\":[\"1570\"],\"roots\":{\"1570\":\"6afd60b2-b789-425f-92a6-4c59e21b2072\"}}];\n",
627
+ " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
628
+ " }\n",
629
+ " if (root.Bokeh !== undefined) {\n",
630
+ " embed_document(root);\n",
631
+ " } else {\n",
632
+ " let attempts = 0;\n",
633
+ " const timer = setInterval(function(root) {\n",
634
+ " if (root.Bokeh !== undefined) {\n",
635
+ " clearInterval(timer);\n",
636
+ " embed_document(root);\n",
637
+ " } else {\n",
638
+ " attempts++;\n",
639
+ " if (attempts > 100) {\n",
640
+ " clearInterval(timer);\n",
641
+ " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
642
+ " }\n",
643
+ " }\n",
644
+ " }, 10, root)\n",
645
+ " }\n",
646
+ "})(window);"
647
+ ],
648
+ "application/vnd.bokehjs_exec.v0+json": ""
649
+ },
650
+ "metadata": {
651
+ "application/vnd.bokehjs_exec.v0+json": {
652
+ "id": "1570"
653
+ }
654
+ },
655
+ "output_type": "display_data"
656
+ }
657
+ ],
658
+ "source": [
659
+ "source = ColumnDataSource(\n",
660
+ " data=dict(\n",
661
+ " x=[1, 2, 3, 4, 5],\n",
662
+ " y=[2, 5, 8, 2, 7],\n",
663
+ " desc=['A', 'b', 'C', 'd', 'E'],\n",
664
+ " )\n",
665
+ ")\n",
666
+ "\n",
667
+ "hover = HoverTool( \n",
668
+ " tooltips=[\n",
669
+ " (\"index\", \"$index\"),\n",
670
+ " (\"(x,y)\", \"($x, $y)\"),\n",
671
+ " (\"desc\", \"@desc\"),\n",
672
+ " ]\n",
673
+ ")\n",
674
+ "\n",
675
+ "p = figure(\n",
676
+ " plot_height=300,\n",
677
+ " plot_width=800,\n",
678
+ " tools=[hover],\n",
679
+ " title=\"Mouse over the dots\"\n",
680
+ ")\n",
681
+ "\n",
682
+ "p.circle(\n",
683
+ " 'x',\n",
684
+ " 'y',\n",
685
+ " size=20,\n",
686
+ " source=source\n",
687
+ ")\n",
688
+ "\n",
689
+ "# show the results\n",
690
+ "show(p)"
691
+ ]
692
+ },
693
+ {
694
+ "cell_type": "markdown",
695
+ "metadata": {},
696
+ "source": [
697
+ "### Widgets"
698
+ ]
699
+ },
700
+ {
701
+ "cell_type": "markdown",
702
+ "metadata": {},
703
+ "source": [
704
+ "Bokeh supports direct integration with a small basic widget set. These can be used in conjunction with a Bokeh Server, or with ``CustomJS`` models to add more interactive capability to your documents. You can see a complete list, with example code in the [Adding Widgets](https://bokeh.pydata.org/en/latest/docs/user_guide/interaction.html#adding-widgets) section of the User's Guide. \n",
705
+ "\n",
706
+ "\n",
707
+ "\n",
708
+ "*NOTE: In this Tutorial chapter, we will focus on using widgets with JavaScript callbacks. The Tutorial chapter on Bokeh server applications covers using Bokeh widgets with real Python callbacks*\n",
709
+ "\n",
710
+ "\n",
711
+ "\n",
712
+ "\n",
713
+ "To use the widgets, include them in a layout like you would a plot object:"
714
+ ]
715
+ },
716
+ {
717
+ "cell_type": "code",
718
+ "execution_count": 9,
719
+ "metadata": {},
720
+ "outputs": [],
721
+ "source": [
722
+ "# from bokeh.models.widgets import Slider"
723
+ ]
724
+ },
725
+ {
726
+ "cell_type": "code",
727
+ "execution_count": 10,
728
+ "metadata": {},
729
+ "outputs": [
730
+ {
731
+ "data": {
732
+ "text/html": [
733
+ "\n",
734
+ " <div class=\"bk-root\" id=\"f09f06f6-dd07-4727-bfa0-ca6cc86fe282\" data-root-id=\"1703\"></div>\n"
735
+ ]
736
+ },
737
+ "metadata": {},
738
+ "output_type": "display_data"
739
+ },
740
+ {
741
+ "data": {
742
+ "application/javascript": [
743
+ "(function(root) {\n",
744
+ " function embed_document(root) {\n",
745
+ " const docs_json = {\"c36bfd78-be38-4f54-9125-26a0e051bb5d\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"end\":10,\"start\":0,\"step\":0.1,\"title\":\"Slider, value\",\"value\":1},\"id\":\"1703\",\"type\":\"Slider\"}],\"root_ids\":[\"1703\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n",
746
+ " const render_items = [{\"docid\":\"c36bfd78-be38-4f54-9125-26a0e051bb5d\",\"root_ids\":[\"1703\"],\"roots\":{\"1703\":\"f09f06f6-dd07-4727-bfa0-ca6cc86fe282\"}}];\n",
747
+ " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
748
+ " }\n",
749
+ " if (root.Bokeh !== undefined) {\n",
750
+ " embed_document(root);\n",
751
+ " } else {\n",
752
+ " let attempts = 0;\n",
753
+ " const timer = setInterval(function(root) {\n",
754
+ " if (root.Bokeh !== undefined) {\n",
755
+ " clearInterval(timer);\n",
756
+ " embed_document(root);\n",
757
+ " } else {\n",
758
+ " attempts++;\n",
759
+ " if (attempts > 100) {\n",
760
+ " clearInterval(timer);\n",
761
+ " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
762
+ " }\n",
763
+ " }\n",
764
+ " }, 10, root)\n",
765
+ " }\n",
766
+ "})(window);"
767
+ ],
768
+ "application/vnd.bokehjs_exec.v0+json": ""
769
+ },
770
+ "metadata": {
771
+ "application/vnd.bokehjs_exec.v0+json": {
772
+ "id": "1703"
773
+ }
774
+ },
775
+ "output_type": "display_data"
776
+ }
777
+ ],
778
+ "source": [
779
+ "slider = Slider(\n",
780
+ " start=0,\n",
781
+ " end=10,\n",
782
+ " value=1,\n",
783
+ " step=.1,\n",
784
+ " title=\"Slider, value\")\n",
785
+ "\n",
786
+ "show(slider)"
787
+ ]
788
+ },
789
+ {
790
+ "cell_type": "markdown",
791
+ "metadata": {},
792
+ "source": [
793
+ "### CustomJS Callbacks\n",
794
+ "\n",
795
+ "In order for a widget to be useful, it needs to be able to perform some action. Using the Bokeh server, it is possible to have widgets trigger real Python code. That possibility will be explored in the Bokeh server chapter of the tutorial. Here, we look at how widgets can be configured with `CustomJS` callbacks that execute snippets of JavaScript code. "
796
+ ]
797
+ },
798
+ {
799
+ "cell_type": "code",
800
+ "execution_count": 11,
801
+ "metadata": {},
802
+ "outputs": [],
803
+ "source": [
804
+ "# from bokeh.models import TapTool, CustomJS, ColumnDataSource"
805
+ ]
806
+ },
807
+ {
808
+ "cell_type": "code",
809
+ "execution_count": 12,
810
+ "metadata": {},
811
+ "outputs": [
812
+ {
813
+ "data": {
814
+ "text/html": [
815
+ "\n",
816
+ " <div class=\"bk-root\" id=\"777432b2-cce7-4d1d-82a9-60058f03b6ca\" data-root-id=\"1767\"></div>\n"
817
+ ]
818
+ },
819
+ "metadata": {},
820
+ "output_type": "display_data"
821
+ },
822
+ {
823
+ "data": {
824
+ "application/javascript": [
825
+ "(function(root) {\n",
826
+ " function embed_document(root) {\n",
827
+ " const docs_json = {\"53b8741e-5b52-4984-ac46-b282021e3a57\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1776\"}],\"center\":[{\"id\":\"1779\"},{\"id\":\"1783\"}],\"height\":400,\"left\":[{\"id\":\"1780\"}],\"renderers\":[{\"id\":\"1792\"}],\"title\":{\"id\":\"1855\"},\"toolbar\":{\"id\":\"1785\"},\"width\":800,\"x_range\":{\"id\":\"1768\"},\"x_scale\":{\"id\":\"1772\"},\"y_range\":{\"id\":\"1770\"},\"y_scale\":{\"id\":\"1774\"}},\"id\":\"1767\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"1861\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1859\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1863\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"coordinates\":null,\"group\":null},\"id\":\"1855\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1862\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1768\",\"type\":\"DataRange1d\"},{\"attributes\":{\"data\":{\"x\":[1,2,3,4,5],\"y\":[2,5,8,2,7]},\"selected\":{\"id\":\"1864\"},\"selection_policy\":{\"id\":\"1863\"}},\"id\":\"1788\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"tools\":[{\"id\":\"1766\"},{\"id\":\"1784\"}]},\"id\":\"1785\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"1770\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1864\",\"type\":\"Selection\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"#1f77b4\"},\"hatch_alpha\":{\"value\":0.1},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#1f77b4\"},\"size\":{\"value\":20},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1790\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1777\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1772\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1774\",\"type\":\"LinearScale\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1861\"},\"group\":null,\"major_label_policy\":{\"id\":\"1862\"},\"ticker\":{\"id\":\"1777\"}},\"id\":\"1776\",\"type\":\"LinearAxis\"},{\"attributes\":{\"fill_color\":{\"value\":\"#1f77b4\"},\"line_color\":{\"value\":\"#1f77b4\"},\"size\":{\"value\":20},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1789\",\"type\":\"Circle\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"#1f77b4\"},\"hatch_alpha\":{\"value\":0.2},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"#1f77b4\"},\"size\":{\"value\":20},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1791\",\"type\":\"Circle\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1788\"},\"glyph\":{\"id\":\"1789\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1791\"},\"nonselection_glyph\":{\"id\":\"1790\"},\"view\":{\"id\":\"1793\"}},\"id\":\"1792\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"axis\":{\"id\":\"1776\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1779\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1781\",\"type\":\"BasicTicker\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1858\"},\"group\":null,\"major_label_policy\":{\"id\":\"1859\"},\"ticker\":{\"id\":\"1781\"}},\"id\":\"1780\",\"type\":\"LinearAxis\"},{\"attributes\":{\"source\":{\"id\":\"1788\"}},\"id\":\"1793\",\"type\":\"CDSView\"},{\"attributes\":{\"callback\":{\"id\":\"1765\"}},\"id\":\"1766\",\"type\":\"TapTool\"},{\"attributes\":{\"axis\":{\"id\":\"1780\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1783\",\"type\":\"Grid\"},{\"attributes\":{\"code\":\"alert('you tapped a circle!')\"},\"id\":\"1765\",\"type\":\"CustomJS\"},{\"attributes\":{},\"id\":\"1858\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1784\",\"type\":\"ResetTool\"}],\"root_ids\":[\"1767\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n",
828
+ " const render_items = [{\"docid\":\"53b8741e-5b52-4984-ac46-b282021e3a57\",\"root_ids\":[\"1767\"],\"roots\":{\"1767\":\"777432b2-cce7-4d1d-82a9-60058f03b6ca\"}}];\n",
829
+ " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
830
+ " }\n",
831
+ " if (root.Bokeh !== undefined) {\n",
832
+ " embed_document(root);\n",
833
+ " } else {\n",
834
+ " let attempts = 0;\n",
835
+ " const timer = setInterval(function(root) {\n",
836
+ " if (root.Bokeh !== undefined) {\n",
837
+ " clearInterval(timer);\n",
838
+ " embed_document(root);\n",
839
+ " } else {\n",
840
+ " attempts++;\n",
841
+ " if (attempts > 100) {\n",
842
+ " clearInterval(timer);\n",
843
+ " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
844
+ " }\n",
845
+ " }\n",
846
+ " }, 10, root)\n",
847
+ " }\n",
848
+ "})(window);"
849
+ ],
850
+ "application/vnd.bokehjs_exec.v0+json": ""
851
+ },
852
+ "metadata": {
853
+ "application/vnd.bokehjs_exec.v0+json": {
854
+ "id": "1767"
855
+ }
856
+ },
857
+ "output_type": "display_data"
858
+ }
859
+ ],
860
+ "source": [
861
+ "callback = CustomJS(\n",
862
+ " code=\"alert('you tapped a circle!')\"\n",
863
+ ")\n",
864
+ "\n",
865
+ "tap = TapTool( \n",
866
+ " callback=callback\n",
867
+ ")\n",
868
+ "\n",
869
+ "p = figure(\n",
870
+ " plot_height=400,\n",
871
+ " plot_width=800,\n",
872
+ " tools=[tap, \"reset\"]\n",
873
+ ")\n",
874
+ "\n",
875
+ "p.circle(\n",
876
+ " x=[1, 2, 3, 4, 5],\n",
877
+ " y=[2, 5, 8, 2, 7],\n",
878
+ " size=20\n",
879
+ ")\n",
880
+ "\n",
881
+ "# show the results\n",
882
+ "show(p)"
883
+ ]
884
+ },
885
+ {
886
+ "cell_type": "markdown",
887
+ "metadata": {},
888
+ "source": [
889
+ "Bokeh objects that have values associated can have small JavaScript actions attached to them using the `js_on_change` method. These actions (also referred to as \"callbacks\") are executed whenever the widget's value is changed. In order to make it easier to refer to specific Bokeh models (e.g., a data source, or a glyph) from JavaScript, the ``CustomJS`` object also accepts a dictionary of \"args\" that map names to Python Bokeh models. The corresponding JavaScript models are made available automatically to the ``CustomJS`` code:\n",
890
+ "\n",
891
+ "```python\n",
892
+ "CustomJS(\n",
893
+ " args=dict(\n",
894
+ " source=source,\n",
895
+ " slider=slider\n",
896
+ " ),\n",
897
+ " code=\"\"\"\n",
898
+ " // easily refer to BokehJS source and slider objects in this JS code\n",
899
+ " var data = source.data;\n",
900
+ " var f = slider.value;\n",
901
+ " \"\"\"\n",
902
+ ")\n",
903
+ "```"
904
+ ]
905
+ },
906
+ {
907
+ "cell_type": "markdown",
908
+ "metadata": {},
909
+ "source": [
910
+ "#### Slider widget example\n",
911
+ "\n",
912
+ "The example below shows an action attached to a slider that updates a data source whenever the slider is moved. "
913
+ ]
914
+ },
915
+ {
916
+ "cell_type": "code",
917
+ "execution_count": 13,
918
+ "metadata": {},
919
+ "outputs": [],
920
+ "source": [
921
+ "# from bokeh.layouts import column\n",
922
+ "# from bokeh.models import CustomJS, ColumnDataSource, Slider"
923
+ ]
924
+ },
925
+ {
926
+ "cell_type": "code",
927
+ "execution_count": 14,
928
+ "metadata": {},
929
+ "outputs": [
930
+ {
931
+ "data": {
932
+ "text/html": [
933
+ "\n",
934
+ " <div class=\"bk-root\" id=\"6b1c3c6c-fd36-4ef9-9d1e-f9310e95a927\" data-root-id=\"1955\"></div>\n"
935
+ ]
936
+ },
937
+ "metadata": {},
938
+ "output_type": "display_data"
939
+ },
940
+ {
941
+ "data": {
942
+ "application/javascript": [
943
+ "(function(root) {\n",
944
+ " function embed_document(root) {\n",
945
+ " const docs_json = {\"2aade121-af7d-4a80-99cf-b2a90e0d3ccb\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"children\":[{\"id\":\"1953\"},{\"id\":\"1916\"}]},\"id\":\"1955\",\"type\":\"Column\"},{\"attributes\":{\"tools\":[{\"id\":\"1933\"},{\"id\":\"1934\"},{\"id\":\"1935\"},{\"id\":\"1936\"},{\"id\":\"1937\"},{\"id\":\"1938\"}]},\"id\":\"1940\",\"type\":\"Toolbar\"},{\"attributes\":{\"line_alpha\":0.6,\"line_color\":\"#1f77b4\",\"line_width\":3,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1948\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1917\",\"type\":\"DataRange1d\"},{\"attributes\":{\"axis\":{\"id\":\"1929\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1932\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"2030\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1919\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"2031\",\"type\":\"AllLabels\"},{\"attributes\":{\"coordinates\":null,\"group\":null},\"id\":\"2027\",\"type\":\"Title\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":3,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1949\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1933\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"1937\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"1934\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"overlay\":{\"id\":\"1939\"}},\"id\":\"1935\",\"type\":\"BoxZoomTool\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1915\"},\"glyph\":{\"id\":\"1948\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1950\"},\"nonselection_glyph\":{\"id\":\"1949\"},\"view\":{\"id\":\"1952\"}},\"id\":\"1951\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"line_alpha\":0.2,\"line_color\":\"#1f77b4\",\"line_width\":3,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1950\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1936\",\"type\":\"SaveTool\"},{\"attributes\":{},\"id\":\"1926\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"2036\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1921\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1938\",\"type\":\"HelpTool\"},{\"attributes\":{},\"id\":\"1923\",\"type\":\"LinearScale\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"2033\"},\"group\":null,\"major_label_policy\":{\"id\":\"2034\"},\"ticker\":{\"id\":\"1926\"}},\"id\":\"1925\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"2034\",\"type\":\"AllLabels\"},{\"attributes\":{\"axis\":{\"id\":\"1925\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1928\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1930\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"2033\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"2030\"},\"group\":null,\"major_label_policy\":{\"id\":\"2031\"},\"ticker\":{\"id\":\"1930\"}},\"id\":\"1929\",\"type\":\"LinearAxis\"},{\"attributes\":{\"bottom_units\":\"screen\",\"coordinates\":null,\"fill_alpha\":0.5,\"fill_color\":\"lightgrey\",\"group\":null,\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":1.0,\"line_color\":\"black\",\"line_dash\":[4,4],\"line_width\":2,\"right_units\":\"screen\",\"syncable\":false,\"top_units\":\"screen\"},\"id\":\"1939\",\"type\":\"BoxAnnotation\"},{\"attributes\":{\"end\":6,\"js_property_callbacks\":{\"change:value\":[{\"id\":\"1954\"}]},\"start\":0.1,\"step\":0.1,\"title\":\"Power, value\",\"value\":1},\"id\":\"1953\",\"type\":\"Slider\"},{\"attributes\":{},\"id\":\"2035\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"source\":{\"id\":\"1915\"}},\"id\":\"1952\",\"type\":\"CDSView\"},{\"attributes\":{\"args\":{\"slider\":{\"id\":\"1953\"},\"source\":{\"id\":\"1915\"}},\"code\":\"\\n var data = source.data;\\n var f = slider.value;\\n var x = data['x']\\n var y = data['y']\\n for (var 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 \"},\"id\":\"1954\",\"type\":\"CustomJS\"},{\"attributes\":{\"data\":{\"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]},\"selected\":{\"id\":\"2036\"},\"selection_policy\":{\"id\":\"2035\"}},\"id\":\"1915\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"below\":[{\"id\":\"1925\"}],\"center\":[{\"id\":\"1928\"},{\"id\":\"1932\"}],\"height\":400,\"left\":[{\"id\":\"1929\"}],\"renderers\":[{\"id\":\"1951\"}],\"title\":{\"id\":\"2027\"},\"toolbar\":{\"id\":\"1940\"},\"width\":800,\"x_range\":{\"id\":\"1917\"},\"x_scale\":{\"id\":\"1921\"},\"y_range\":{\"id\":\"1919\"},\"y_scale\":{\"id\":\"1923\"}},\"id\":\"1916\",\"subtype\":\"Figure\",\"type\":\"Plot\"}],\"root_ids\":[\"1955\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n",
946
+ " const render_items = [{\"docid\":\"2aade121-af7d-4a80-99cf-b2a90e0d3ccb\",\"root_ids\":[\"1955\"],\"roots\":{\"1955\":\"6b1c3c6c-fd36-4ef9-9d1e-f9310e95a927\"}}];\n",
947
+ " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
948
+ " }\n",
949
+ " if (root.Bokeh !== undefined) {\n",
950
+ " embed_document(root);\n",
951
+ " } else {\n",
952
+ " let attempts = 0;\n",
953
+ " const timer = setInterval(function(root) {\n",
954
+ " if (root.Bokeh !== undefined) {\n",
955
+ " clearInterval(timer);\n",
956
+ " embed_document(root);\n",
957
+ " } else {\n",
958
+ " attempts++;\n",
959
+ " if (attempts > 100) {\n",
960
+ " clearInterval(timer);\n",
961
+ " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
962
+ " }\n",
963
+ " }\n",
964
+ " }, 10, root)\n",
965
+ " }\n",
966
+ "})(window);"
967
+ ],
968
+ "application/vnd.bokehjs_exec.v0+json": ""
969
+ },
970
+ "metadata": {
971
+ "application/vnd.bokehjs_exec.v0+json": {
972
+ "id": "1955"
973
+ }
974
+ },
975
+ "output_type": "display_data"
976
+ }
977
+ ],
978
+ "source": [
979
+ "x = [x*0.005 for x in range(0, 201)]\n",
980
+ "\n",
981
+ "source = ColumnDataSource(\n",
982
+ " data=dict(x=x, y=x)\n",
983
+ ")\n",
984
+ "\n",
985
+ "# create a new plot using figure\n",
986
+ "plot = figure(\n",
987
+ " plot_height=400,\n",
988
+ " plot_width=800\n",
989
+ ")\n",
990
+ "\n",
991
+ "plot.line(\n",
992
+ " 'x',\n",
993
+ " 'y',\n",
994
+ " line_width=3,\n",
995
+ " line_alpha=0.6,\n",
996
+ " source=source\n",
997
+ ")\n",
998
+ "\n",
999
+ "slider = Slider(\n",
1000
+ " start=0.1,\n",
1001
+ " end=6,\n",
1002
+ " value=1,\n",
1003
+ " step=.1,\n",
1004
+ " title=\"Power, value\"\n",
1005
+ ")\n",
1006
+ "\n",
1007
+ "update_curve = CustomJS(\n",
1008
+ " args=dict(\n",
1009
+ " source=source,\n",
1010
+ " slider=slider\n",
1011
+ " ),\n",
1012
+ " code=\"\"\"\n",
1013
+ " var data = source.data;\n",
1014
+ " var f = slider.value;\n",
1015
+ " var x = data['x']\n",
1016
+ " var y = data['y']\n",
1017
+ " for (var i = 0; i < x.length; i++) {\n",
1018
+ " y[i] = Math.pow(x[i], f)\n",
1019
+ " }\n",
1020
+ " \n",
1021
+ " // necessary becasue we mutated source.data in-place\n",
1022
+ " source.change.emit();\n",
1023
+ " \"\"\"\n",
1024
+ ")\n",
1025
+ "slider.js_on_change(\n",
1026
+ " 'value',\n",
1027
+ " update_curve\n",
1028
+ ")\n",
1029
+ "\n",
1030
+ "# show the results\n",
1031
+ "show(\n",
1032
+ " column(\n",
1033
+ " slider,\n",
1034
+ " plot\n",
1035
+ " )\n",
1036
+ ")"
1037
+ ]
1038
+ },
1039
+ {
1040
+ "cell_type": "markdown",
1041
+ "metadata": {},
1042
+ "source": [
1043
+ "#### Data selection example\n",
1044
+ "\n",
1045
+ "It's also possible to make JavaScript actions that execute whenever a user selection (e.g., box, point, lasso) changes. This is done by attaching the same kind of CustomJS object to whatever data source the selection is made on. The example below is a bit more sophisticated, and demonstrates updating one glyph's data source in response to another glyph's selection: "
1046
+ ]
1047
+ },
1048
+ {
1049
+ "cell_type": "code",
1050
+ "execution_count": 15,
1051
+ "metadata": {},
1052
+ "outputs": [],
1053
+ "source": [
1054
+ "# from random import random"
1055
+ ]
1056
+ },
1057
+ {
1058
+ "cell_type": "code",
1059
+ "execution_count": 16,
1060
+ "metadata": {},
1061
+ "outputs": [
1062
+ {
1063
+ "data": {
1064
+ "text/html": [
1065
+ "\n",
1066
+ " <div class=\"bk-root\" id=\"16f32573-89bf-4e32-b739-c3bf6f00c2a8\" data-root-id=\"2093\"></div>\n"
1067
+ ]
1068
+ },
1069
+ "metadata": {},
1070
+ "output_type": "display_data"
1071
+ },
1072
+ {
1073
+ "data": {
1074
+ "application/javascript": [
1075
+ "(function(root) {\n",
1076
+ " function embed_document(root) {\n",
1077
+ " const docs_json = {\"ec349326-c0db-46a5-b9a0-0a8f74f1f2c6\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"2104\"}],\"center\":[{\"id\":\"2107\"},{\"id\":\"2111\"}],\"height\":400,\"left\":[{\"id\":\"2108\"}],\"renderers\":[{\"id\":\"2124\"},{\"id\":\"2131\"}],\"title\":{\"id\":\"2094\"},\"toolbar\":{\"id\":\"2115\"},\"width\":800,\"x_range\":{\"id\":\"2096\"},\"x_scale\":{\"id\":\"2100\"},\"y_range\":{\"id\":\"2098\"},\"y_scale\":{\"id\":\"2102\"}},\"id\":\"2093\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"field\":\"color\"},\"hatch_alpha\":{\"value\":0.1},\"hatch_color\":{\"field\":\"color\"},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"field\":\"color\"},\"size\":{\"value\":8},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2121\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"2098\",\"type\":\"DataRange1d\"},{\"attributes\":{\"source\":{\"id\":\"2126\"}},\"id\":\"2132\",\"type\":\"CDSView\"},{\"attributes\":{\"js_property_callbacks\":{\"change:indices\":[{\"id\":\"2133\"}]}},\"id\":\"2134\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"2105\",\"type\":\"BasicTicker\"},{\"attributes\":{\"coordinates\":null,\"fill_alpha\":0.5,\"fill_color\":\"lightgrey\",\"group\":null,\"level\":\"overlay\",\"line_alpha\":1.0,\"line_color\":\"black\",\"line_dash\":[4,4],\"line_width\":2,\"syncable\":false,\"xs_units\":\"screen\",\"ys_units\":\"screen\"},\"id\":\"2114\",\"type\":\"PolyAnnotation\"},{\"attributes\":{},\"id\":\"2100\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"2102\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"2109\",\"type\":\"BasicTicker\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"2222\"},\"group\":null,\"major_label_policy\":{\"id\":\"2223\"},\"ticker\":{\"id\":\"2105\"}},\"id\":\"2104\",\"type\":\"LinearAxis\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.4},\"fill_color\":{\"value\":\"firebrick\"},\"hatch_alpha\":{\"value\":0.4},\"hatch_color\":{\"value\":\"firebrick\"},\"line_alpha\":{\"value\":0.4},\"line_color\":{\"value\":\"firebrick\"},\"size\":{\"value\":8},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2122\",\"type\":\"Circle\"},{\"attributes\":{\"overlay\":{\"id\":\"2114\"}},\"id\":\"2112\",\"type\":\"LassoSelectTool\"},{\"attributes\":{},\"id\":\"2220\",\"type\":\"AllLabels\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"2118\"},\"glyph\":{\"id\":\"2120\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"2123\"},\"nonselection_glyph\":{\"id\":\"2121\"},\"selection_glyph\":{\"id\":\"2122\"},\"view\":{\"id\":\"2125\"}},\"id\":\"2124\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"2219\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"axis\":{\"id\":\"2108\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"2111\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"2222\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"field\":\"color\"},\"hatch_alpha\":{\"value\":0.2},\"hatch_color\":{\"field\":\"color\"},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"field\":\"color\"},\"size\":{\"value\":8},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2123\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"2223\",\"type\":\"AllLabels\"},{\"attributes\":{\"source\":{\"id\":\"2118\"}},\"id\":\"2125\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"2224\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"data\":{\"xm\":[0,1],\"ym\":[0.5,0.5]},\"selected\":{\"id\":\"2227\"},\"selection_policy\":{\"id\":\"2226\"}},\"id\":\"2126\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"tools\":[{\"id\":\"2112\"},{\"id\":\"2113\"}]},\"id\":\"2115\",\"type\":\"Toolbar\"},{\"attributes\":{\"data\":{\"color\":[\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\",\"navy\"],\"x\":[0.09302181097386675,0.36961673241775583,0.1842517267522943,0.12667346097044319,0.6711475930815108,0.316938706789471,0.938951657257918,0.8422115693723374,0.2783716799586854,0.7595992922845058,0.6293970401243864,0.6753339191900829,0.4972006876179361,0.9846708335013953,0.7473016827822025,0.6744250576301605,0.6726683920155768,0.8956449258638982,0.2798986864650468,0.6331464651310674,0.6094227528561963,0.7758133482856935,0.6475603525170737,0.9657281312867102,0.37456930343085404,0.6078751372074538,0.4333917142953414,0.8134402808090768,0.8134570271774286,0.8396899539780317,0.19378696521464278,0.2682535189280928,0.6601026976309199,0.4820859771000894,0.5123563206733008,0.7570176319258398,0.8788542996083077,0.7640233848111225,0.12903003163058213,0.2282217337494592,0.9462191421874969,0.7685447001559736,0.9327862896767634,0.18988408563463777,0.580326958246362,0.9492872702458088,0.18021186888652874,0.9269798445585189,0.6328657307538821,0.5928657163594561,0.03755572230360238,0.7531269676218401,0.14119264240758833,0.9290446099170696,0.7011169264873328,0.40316188915828777,0.36920585572400433,0.9289361386511331,0.19781791511658542,0.8386420952517373,0.6109313894135948,0.01326179220938184,0.8472339633167579,0.5855244448836061,0.5088016735343376,0.7917695826905041,0.27244726217767035,0.42034480999592805,0.26652134116436466,0.16171604738439194,0.13328280193603714,0.1839274537082174,0.525946856632911,0.6811609229196959,0.9300630757215481,0.9183429843042029,0.07185516295254657,0.04075884388884021,0.09774809748444302,0.21449667849237597,0.5027434123209583,0.19972551064163546,0.5093043601409899,0.47132514834148054,0.05664579437580297,0.08244400676727137,0.18089889011741322,0.6505498585141976,0.47158293044382593,0.9887297030145444,0.5604247026433328,0.9691239080233868,0.3135320314517889,0.9225437110986295,0.36777967686443314,0.7841460616627872,0.5921324053613113,0.15343318653624283,0.9345238638829656,0.3771275154612417,0.7668238980659824,0.34864109006750066,0.8480036018244052,0.9830588148808017,0.0013583436727295783,0.4430010265037885,0.42780682426598604,0.3409550688407883,0.765948812194233,0.46071674640633753,0.8973187188602079,0.6397284475981542,0.09065579611138364,0.3984928499576429,0.26169244082851384,0.9379610472483295,0.5361672657153513,0.38530659254810273,0.4997741305850193,0.17675557265702313,0.10206267851425332,0.05273693482363484,0.5152592858247158,0.6208032905732885,0.23049013866736778,0.4632810433700211,0.21116648801701166,0.04406368969701202,0.36264396927141673,0.6118541788338218,0.3683041832821975,0.7841842017410342,0.580001205261833,0.40846399344821593,0.4250274029834712,0.8518069436444938,0.6119590765875148,0.29370861063114717,0.7589983377244861,0.2498141398083199,0.02043224994760051,0.06833489969669782,0.1450786468365599,0.23334365856636619,0.15056783344135294,0.222918269525348,0.5748654296401259,0.755407240501869,0.3347272895836012,0.26544560926398386,0.5925937436553514,0.36468780017515134,0.7792012226633932,0.6463852210018772,0.6953012797138107,0.8614048044291756,0.3182320266416999,0.18042340976390903,0.8372967458194296,0.7209452093954256,0.5274699862799468,0.023916438668427964,0.6042149525396939,0.4584995899095152,0.9033190473299618,0.46368480204602214,0.7994801728308151,0.22679992436998853,0.2657819782040409,0.016686315699029786,0.47007085373239166,0.09477464713260586,0.5010483779247094,0.8197105564865679,0.3983856212051662,0.7402829842709161,0.9245465326009119,0.06077350755375188,0.6642554953476627,0.6472675737065208,0.27356754382953385,0.5057650925641465,0.6728101164486762,0.8475692368945161,0.6875652550066934,0.20273722150194495,0.8184682885641733,0.8516941765928344,0.7272034451729886,0.07332668659157149,0.5392780906826296,0.4446164278230591,0.12857918658343892,0.5294726522184626,0.7366617242882254,0.9913543677927946,0.4021060370325864,0.6700065731622009,0.9142135084551062,0.929750189673134,0.8909413813493752,0.08801006769241626,0.6395979840190429,0.15928260105960546,0.1150917427188276,0.9073755079617024,0.04940823721172716,0.2507620049547269,0.013169808004419359,0.8194012630060727,0.4058288884979415,0.24767268324416436,0.038044015912600315,0.2339827672964967,0.15242613294064133,0.9475716475146132,0.6999228615239789,0.33677153674749294,0.5210131324098504,0.9522708295101703,0.9728781915657366,0.6113191038395698,0.4042584287343598,0.9035953540601354,0.5435490045479643,0.036480031866666596,0.1418311423116999,0.2866212002159848,0.24192755619018813,0.8164216778366996,0.6340880176456039,0.43370917722316316,0.242504160790189,0.37817784469908067,0.4265255588603867,0.6813199987388256,0.8849650298647906,0.06293228303630916,0.7838957739253085,0.8837540498270343,0.45430429194460653,0.4560084248451213,0.6012464798326763,0.2966955748325695,0.8357406996299037,0.9879375423914325,0.5794808950699003,0.6141319190777881,0.3720532922293398,0.819989663564914,0.38712532164276425,0.14215708371189895,0.9037478832308663,0.2522846163451109,0.5332180050063522,0.5073031193637372,0.9364566644543136,0.2774686089596329,0.8790054570067367,0.9404559247955833,0.18995803566250713,0.9321125567359689,0.5980640509436448,0.976926793583349,0.5462395898482801,0.07981086684607397,0.5328963815283383,0.009020784333289122,0.9728412867145501,0.790048623682364,0.6268139235846558,0.8286694117026832,0.2897739212809871,0.6927983666881815,0.22960378545073956,0.6846404738507191,0.4876307641234192,0.6303818918454461,0.9095900647963487,0.2764438777375875,0.896445313460513,0.9679168488103861,0.8797197014460078,0.9253220597068681,0.09534073798840981,0.058956542724762806,0.40906206626351016,0.11789338138861027,0.4118208469280842,0.09300595663262079,0.3459589275300534,0.7240493346516516,0.9843319313969056,0.060353856099385705,0.3228112269116017,0.18737447050785272,0.8383267347710106,0.2976718292424292,0.5075822845883894,0.8245516757495797,0.5853151297112682,0.32475012188049013,0.005903688480987657,0.4965091518076332,0.09931057919321995,0.22789204537892016,0.1761936959812449,0.8607405384947633,0.21925153521231322,0.7285710689133905,0.02534883876712779,0.1998632885813636,0.12042817098122827,0.3709775327559761,0.002696956443310028,0.7315023568705004,0.20748831733831796,0.6197433540280599,0.6435284862299403,0.07083045626787021,0.3644270932098582,0.7868629440943301,0.2076609687513793,0.39192247675543834,0.592842213006765,0.4789952837541166,0.6230987377887566,0.9205179372375903,0.7768640900717633,0.692312897391377,0.7481926484382652,0.05506612216828466,0.45572532455123815,0.7304630067428561,0.38428704529035873,0.6452119614058489,0.9237139392664713,0.21906422248308688,0.2754462918306384,0.16454916463845182,0.7996274300209908,0.8831572583536961,0.777308444398044,0.6541787738608666,0.5418905461662598,0.17751440095671822,0.3389538189590341,0.7720134839532353,0.5493574128151837,0.21563880638496613,0.5291215509709427,0.11766200768511259,0.8371641594472194,0.20558874726735998,0.9614289781670893,0.9215164425700324,0.17488233227587713,0.34825294879047364,0.747355236859777,0.13593444302203828,0.27985593447953694,0.2811870478366849,0.683312125070314,0.5299616712466125,0.5784288957056446,0.49358428737026827,0.9415414560943673,0.7349124156823428,0.6765147665947037,0.4154134938361105,0.11001080396858909,0.5734151858309059,0.7650508152645126,0.023212734961089998,0.02213336489014095,0.8170692861115798,0.7764473310790112,0.9956573794697285,0.5456544644723854,0.8109016956594883,0.6480329679666772,0.07589954041844771,0.45785115750025707,0.9792556333076542,0.6316401182611827,0.7014423246549583,0.37496376048153324,0.6193351989131209,0.3525312666156031,0.9782849411125508,0.22600097885629722,0.4298544736751454,0.9957250167176809,0.8615699510338412,0.04052428996775137,0.4854509153778763,0.6116324879787886,0.912392806627935,0.6207360911251684,0.14082459873842956,0.3418036989913803,0.9415640412702606,0.6418458426046318,0.6476181035519862,0.8015282551032955,0.5150340304439497,0.2264520435254469,0.4275458652670977,0.56712364408322,0.34363074885588274,0.778441800861176,0.9162832842901977,0.5985771065240089,0.46492303830052106,0.28747757559743925,0.25677705217013425,0.34799833898071475,0.4657209430375784,0.016284454319043462,0.47513705502718506,0.9476852690379701,0.3720140391146305,0.20880301164515014,0.22290379949663275,0.2347437595125812,0.32460533093814836,0.19639177441162514,0.6609559358795135,0.34501684995080795,0.46681036628853756,0.03317942085415082,0.3200672406996371,0.6816024737376667,0.7683288703728993,0.18360296692060585,0.19029706121805567,0.9955164170332419,0.4199214446884897,0.8024271402311517,0.9156732692030293,0.45591600342199534,0.6511029328919997,0.671872312841385,0.2299359376835226,0.810565036422248,0.8585441755223483,0.9631250178157164,0.4161325534693011,0.7898812710989792,0.4916475857042035,0.083878635424949,0.32520375098960175,0.9745813200834856,0.8768894179218395,0.2463560320562328,0.11642790229114686,0.5895994062047312,0.29142159877132356,0.24168978276651432,0.5925761115273243,0.14395111925700077,0.8352857090948981,0.3782995579080044,0.9903788356025939,0.970720746061426,0.94002356231288,0.7797160724492863,0.04291118381438708,0.2323982337897128,0.7136557894589052,0.20288937228888504,0.5870612647781521,0.7637332558646406,0.21531846477019834,0.9956052051342693,0.34409054048647336,0.3399050518001744,0.09242560784540699,0.4227723337999154,0.43981276575244743,0.9616177414736529,0.6520668381341834,0.7085538817564303,0.6236507730900377,0.42171950227323374,0.14519514510732845,0.33447680992312745,0.45717084420351006,0.5708767991575863,0.5345100370017867,0.33234259787614817,0.5717572299203761,0.6697521393585193,0.642234017178162,0.5340903845441461,0.6391855993807225,0.6928445039529931,0.8567643952612894,0.5473259581512209,0.983652967562169],\"y\":[0.08462774654693128,0.8417912194737555,0.018872332021768412,0.5254635653809977,0.653626006257348,0.13788628214313525,0.5612679587715045,0.6381478363591534,0.10505155962543822,0.8545560100747418,0.2506966451065502,0.897974988006223,0.9903186843566948,0.4395082047090534,0.9080479801700524,0.826935814776524,0.8940660522916322,0.2524795083886291,0.645191985734595,0.06240028424068278,0.006194475862456361,0.6830597822493439,0.49753784562597025,0.2986639119671599,0.8768336811853985,0.6381688273426392,0.7209824124049823,0.029183082878684208,0.39435504232292007,0.7243117927076939,0.7591190142768625,0.756225973751071,0.4208008537287089,0.37697185148652956,0.6670196521946489,0.7075344974511532,0.032670845410613714,0.6825380851515195,0.11252631559543436,0.6137245842672397,0.25698504680086154,0.8083688016809842,0.7639396978627935,0.6620380439517876,0.7718426999523045,0.10551178867969935,0.19267896756889202,0.6643930201085337,0.9109582529649297,0.9516720165467586,0.36587909492870974,0.32906997429558493,0.47618689527577085,0.658680273062196,0.1216224092381536,0.2265051356967066,0.15259633144198204,0.1671433268731901,0.9246256948904741,0.8390648201247568,0.2880731544634426,0.33747833060392163,0.6722431015491455,0.7988112929013796,0.7169541713333172,0.769253271470581,0.10301381501581552,0.735461172165386,0.5948710752366796,0.6485404143640597,0.4761952710411532,0.49422371024388767,0.5675029378623306,0.312011084701347,0.6027481190439918,0.53016351522543,0.8824674644093013,0.8397830869287609,0.04737735876715443,0.7214946151590996,0.36799768284304724,0.6005403602197474,0.5461829748731052,0.8599645697792657,0.34528120483749536,0.4630448592609224,0.6811544775455779,0.2541211194869548,0.26139104525661316,0.6838597355811449,0.4593458792546463,0.5283374551356607,0.8974068821280237,0.25391037743740774,0.3041849363788176,0.8472306187057659,0.2875661562893599,0.047892748562186394,0.29264531200694377,0.3502413383051006,0.5552274287850076,0.5198836541093482,0.5757441619562164,0.18920260625058527,0.241241174705485,0.24437858500658327,0.6696132660486807,0.976164418916027,0.8395405394047886,0.7020118866484732,0.5929611379738887,0.43715800382423353,0.3774091822617951,0.2504753011267977,0.3922304283222777,0.954246941414301,0.5028436375214732,0.38193989782763305,0.39596360309415146,0.4541290566340749,0.02441284368279295,0.9773667644859236,0.13942927964994434,0.4162906250763274,0.661881555140442,0.1491114988651484,0.7926838026535532,0.1700235701810442,0.8675298288188085,0.10721445821912767,0.5414772126103807,0.06093986730483936,0.6259401001986863,0.062112545824786536,0.19331913866757178,0.12029057300979351,0.7948649886097864,0.8741301389166067,0.6582458376722892,0.3885539127766503,0.4918340880743395,0.7809571007192654,0.48817533157094406,0.8593107163135422,0.22269135785932948,0.050840322245667036,0.23026556625618488,0.19286902115165494,0.0482321507290856,0.1127200624606507,0.06302774447500759,0.02054321244224433,0.9525048846949922,0.17144689871532726,0.5914533158240768,0.8348375809309894,0.33150535319638885,0.6529949424866959,0.09007680566844856,0.34969575088554317,0.4928823983660864,0.5664770890056905,0.6185117748964294,0.7680345868071332,0.761747293807481,0.7739766333082418,0.7947137014093465,0.7456247333946362,0.7911742215605349,0.29852286223850377,0.10108425313455693,0.37657556248914115,0.37405618069328816,0.971649347502301,0.195278627469056,0.9027355500038072,0.09543208158055894,0.7555601117549294,0.742405079019603,0.4750568094555442,0.10003850465192787,0.3392624434613625,0.015917336598915144,0.11753463509717943,0.038021239960576936,0.8903516867120634,0.9306662698138681,0.6970437790554717,0.6725846728329301,0.003852001746564415,0.06001173733725451,0.5687348606841507,0.23439459751070602,0.439055945576317,0.5286859146018847,0.08807305599907367,0.7273688984185059,0.5506762179297592,0.7491189810993971,0.5040973660830865,0.32611487752137214,0.18397666191714712,0.6036971052770034,0.3504966291612429,0.07708186062312639,0.20280015907001558,0.4221718790485788,0.18759027702406494,0.6328940331607035,0.42485342716524765,0.5404858191166668,0.022879879625208432,0.6709919881293239,0.8098580711670003,0.03721702417072836,0.45020178788853327,0.13362823432355186,0.7566334657353421,0.8915229582443674,0.5215266988689201,0.9928427853151397,0.31915240513721255,0.1745469425477434,0.8221686790734796,0.3640702970619235,0.04534339397960996,0.17552764798242337,0.7893222350360831,0.5423442530670102,0.5041249873029413,0.14318514459401022,0.0917802671911997,0.8918503823971178,0.8986079656698389,0.2721878050285762,0.5119832769298759,0.7585085242608584,0.7076264425414686,0.187966380086668,0.3254540541490686,0.2165947706032828,0.7811408144963568,0.2294596904388102,0.5979877810143414,0.8355944368525545,0.0783333805117874,0.8079833828023625,0.1805785813488262,0.33984054170566524,0.19569655055176594,0.1059433230028507,0.11671594899717253,0.34730720828619255,0.1993275329917763,0.5783870035244569,0.5376916252928521,0.2598428477611642,0.6954453635758617,0.2984110831422845,0.5783063332584946,0.5654504598825986,0.6025829967571072,0.20534069431127977,0.8931834150428295,0.18762863697486187,0.9492686174167612,0.11882995930503293,0.25527778466256434,0.7471398115783318,0.10502489183274721,0.4420851920606228,0.8459359403569091,0.7232275043091511,0.4588075728349862,0.37297839759206675,0.5559190051031024,0.3115394218704427,0.7839728301918472,0.15175616038317008,0.23455151488304116,0.3352193235485197,0.848386738661146,0.5790121978418314,0.7402441767671761,0.8954818698112612,0.061963773210121476,0.631659733769842,0.9671921735749143,0.006792750702107941,0.46203332185232937,0.6706408356750415,0.96046875731989,0.04240885683023288,0.2697944087232118,0.5195158522373241,0.4287321458592237,0.4265628973718264,0.014832637653257486,0.32391294259125514,0.6355644038513982,0.08511869480985079,0.8061261791248714,0.9399915122841324,0.8965280952890623,0.5366473028146183,0.5097709815440568,0.7962462350942566,0.3825737562666861,0.29597115727526635,0.9974120582318098,0.6493149309688531,0.9444531562662201,0.5550250496143371,0.5578307783787035,0.5065950822357036,0.6700301354710163,0.5240606051153228,0.10818863334057127,0.08154236961384231,0.02362163553355534,0.4142249450493355,0.9084335326497485,0.903825578609546,0.5843876796246857,0.4461759589890347,0.4380629830130096,0.9139770405745606,0.3027567179335655,0.07910237325505698,0.5241227696744962,0.9629838628436532,0.659710839718964,0.7940670759389017,0.2731583334353138,0.1489679696793248,0.5453718234059831,0.9724930335557704,0.23996280441540363,0.08598058864327607,0.18402083954795012,0.15790200837019364,0.10342654719992406,0.05193257544812735,0.08794906796834467,0.331215777201184,0.5235900753126963,0.351678124430312,0.6159076659937482,0.8385633406625854,0.17069591792647598,0.28654595925323467,0.03576003254305571,0.6455507796895648,0.9109949073728458,0.6718658376578267,0.28339711338260276,0.5906835505235085,0.3890312474518127,0.07352825294319942,0.7053195864613357,0.5071405037674374,0.24480495363439592,0.8075274555064462,0.10308058422258493,0.6781618461292003,0.8038802516884577,0.37678674763488884,0.02466217027389206,0.5480588938005913,0.6581351222803052,0.35085830754588554,0.4972638648408345,0.2847087580536525,0.5469044437605072,0.733214421764762,0.17739456771340367,0.7815882610642709,0.556595290823421,0.565087096782529,0.5792155619710491,0.7039806968817667,0.8973824895434397,0.3684525021434695,0.492947130040413,0.6429030939515878,0.5030485735078185,0.25594463337746864,0.19968210002437647,0.17755264939661286,0.7739393583679983,0.7262900160744944,0.5954258596574832,0.729339295280024,0.1645817426109616,0.3043644631275828,0.8629724470252464,0.3408378660026631,0.026422667695498503,0.6444097943012577,0.6367311979882837,0.48841523366399353,0.4289688562933097,0.49479000558191666,0.7140178455434669,0.7251768155182218,0.5608866595905153,0.9953288002546447,0.8408468068576387,0.8215363737104436,0.39178068989621573,0.09298141421318418,0.3313766151379802,0.34086122765082416,0.9013601934385302,0.0481122367472917,0.8298149377119963,0.6562966981953942,0.8151088414314649,0.0608802333326649,0.3521902438939791,0.2749204938158456,0.33586764101598243,0.8533966144860865,0.4325088476143629,0.19545831628874843,0.18841304129602765,0.6714183730439156,0.46219301168205984,0.4694338862347647,0.6299651825915313,0.3364978027890756,0.573272273327592,0.06331442669761667,0.9265409096128877,0.5759940965251019,0.5539899011709843,0.8610436448734146,0.22303428982267948,0.7944014019641795,0.2510931513200291,0.5443142405134282,0.6121672734427763,0.5888697223693802,0.46527760204409774,0.6637887679230905,0.4572023621181369,0.2607103837688405,0.034381094340278695,0.37898115157911527,0.8668629740103379,0.5816535096238596,0.4420866066119695,0.056278338607662626,0.15297384018575988,0.09561650044253045,0.7857105198669136,0.06871058760313842,0.1317694660066654,0.35922706084323297,0.06267592555556911,0.3851998109724817,0.16968115495017255,0.3814659901383237,0.5476120030179189,0.45249568288001507,0.0687319723082278,0.3733388536283464,0.7351022852558361,0.9227672686353019,0.08128295993149481,0.5786480759830748,0.12332296319890357,0.5697670707351802,0.23028165272402412,0.7568714836895871,0.40937488371471364,0.5316861107717186,0.5136664458064741,0.9911462494059436,0.32141726909004165,0.29735792915700776,0.6548016006510224,0.010390847396530734,0.5012033133109246,0.5325743598778824,0.736269490240604,0.9038752340724042,0.5000798719532615,0.5965048865796475,0.7627701476075505,0.39253006133677226,0.5378198147408332,0.7237929298317207,0.1728938982202185,0.5634470389939675,0.7921414044998482,0.8768809930776341,0.5225903546923327,0.7910919733259689,0.982435855647706]},\"selected\":{\"id\":\"2134\"},\"selection_policy\":{\"id\":\"2224\"}},\"id\":\"2118\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"2113\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"2227\",\"type\":\"Selection\"},{\"attributes\":{\"axis\":{\"id\":\"2104\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"2107\",\"type\":\"Grid\"},{\"attributes\":{\"args\":{\"s1\":{\"id\":\"2118\"},\"s2\":{\"id\":\"2126\"}},\"code\":\"\\n var inds = s1.selected.indices;\\n if (inds.length == 0)\\n return;\\n\\n var ym = 0\\n for (var i = 0; i < inds.length; i++) {\\n ym += s1.data.y[inds[i]]\\n }\\n \\n ym /= inds.length\\n s2.data.ym = [ym, ym]\\n\\n // necessary because the source.data mutated in-place\\n s2.change.emit(); \\n \"},\"id\":\"2133\",\"type\":\"CustomJS\"},{\"attributes\":{\"line_alpha\":0.6,\"line_color\":\"orange\",\"line_width\":5,\"x\":{\"field\":\"xm\"},\"y\":{\"field\":\"ym\"}},\"id\":\"2128\",\"type\":\"Line\"},{\"attributes\":{\"coordinates\":null,\"group\":null,\"text\":\"Select Here\"},\"id\":\"2094\",\"type\":\"Title\"},{\"attributes\":{\"line_alpha\":0.2,\"line_color\":\"orange\",\"line_width\":5,\"x\":{\"field\":\"xm\"},\"y\":{\"field\":\"ym\"}},\"id\":\"2130\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"2226\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"2126\"},\"glyph\":{\"id\":\"2128\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"2130\"},\"nonselection_glyph\":{\"id\":\"2129\"},\"view\":{\"id\":\"2132\"}},\"id\":\"2131\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"2219\"},\"group\":null,\"major_label_policy\":{\"id\":\"2220\"},\"ticker\":{\"id\":\"2109\"}},\"id\":\"2108\",\"type\":\"LinearAxis\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.4},\"fill_color\":{\"field\":\"color\"},\"hatch_alpha\":{\"value\":0.4},\"hatch_color\":{\"field\":\"color\"},\"line_alpha\":{\"value\":0.4},\"line_color\":{\"field\":\"color\"},\"size\":{\"value\":8},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2120\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"2096\",\"type\":\"DataRange1d\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"orange\",\"line_width\":5,\"x\":{\"field\":\"xm\"},\"y\":{\"field\":\"ym\"}},\"id\":\"2129\",\"type\":\"Line\"}],\"root_ids\":[\"2093\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n",
1078
+ " const render_items = [{\"docid\":\"ec349326-c0db-46a5-b9a0-0a8f74f1f2c6\",\"root_ids\":[\"2093\"],\"roots\":{\"2093\":\"16f32573-89bf-4e32-b739-c3bf6f00c2a8\"}}];\n",
1079
+ " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
1080
+ " }\n",
1081
+ " if (root.Bokeh !== undefined) {\n",
1082
+ " embed_document(root);\n",
1083
+ " } else {\n",
1084
+ " let attempts = 0;\n",
1085
+ " const timer = setInterval(function(root) {\n",
1086
+ " if (root.Bokeh !== undefined) {\n",
1087
+ " clearInterval(timer);\n",
1088
+ " embed_document(root);\n",
1089
+ " } else {\n",
1090
+ " attempts++;\n",
1091
+ " if (attempts > 100) {\n",
1092
+ " clearInterval(timer);\n",
1093
+ " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
1094
+ " }\n",
1095
+ " }\n",
1096
+ " }, 10, root)\n",
1097
+ " }\n",
1098
+ "})(window);"
1099
+ ],
1100
+ "application/vnd.bokehjs_exec.v0+json": ""
1101
+ },
1102
+ "metadata": {
1103
+ "application/vnd.bokehjs_exec.v0+json": {
1104
+ "id": "2093"
1105
+ }
1106
+ },
1107
+ "output_type": "display_data"
1108
+ }
1109
+ ],
1110
+ "source": [
1111
+ "x = [random() for x in range(500)]\n",
1112
+ "y = [random() for y in range(500)]\n",
1113
+ "color = [\"navy\"] * len(x)\n",
1114
+ "\n",
1115
+ "# create a new plot using figure\n",
1116
+ "p = figure(\n",
1117
+ " plot_width=800,\n",
1118
+ " plot_height=400,\n",
1119
+ " tools=\"lasso_select, reset\",\n",
1120
+ " title=\"Select Here\"\n",
1121
+ ")\n",
1122
+ "\n",
1123
+ "s1 = ColumnDataSource(\n",
1124
+ " data=dict(\n",
1125
+ " x=x,\n",
1126
+ " y=y,\n",
1127
+ " color=color\n",
1128
+ " )\n",
1129
+ ")\n",
1130
+ "p.circle(\n",
1131
+ " 'x',\n",
1132
+ " 'y',\n",
1133
+ " color='color',\n",
1134
+ " size=8,\n",
1135
+ " alpha=0.4,\n",
1136
+ " source=s1, \n",
1137
+ " selection_color=\"firebrick\",\n",
1138
+ " selection_alpha=0.4\n",
1139
+ ")\n",
1140
+ "\n",
1141
+ "s2 = ColumnDataSource(\n",
1142
+ " data=dict(\n",
1143
+ " xm=[0,1],\n",
1144
+ " ym=[0.5, 0.5]\n",
1145
+ " )\n",
1146
+ ")\n",
1147
+ "p.line(\n",
1148
+ " x='xm',\n",
1149
+ " y='ym',\n",
1150
+ " color=\"orange\",\n",
1151
+ " line_width=5,\n",
1152
+ " alpha=0.6,\n",
1153
+ " source=s2\n",
1154
+ ")\n",
1155
+ "\n",
1156
+ "callback = CustomJS(\n",
1157
+ " args=dict(\n",
1158
+ " s1=s1,\n",
1159
+ " s2=s2\n",
1160
+ " ),\n",
1161
+ " code=\"\"\"\n",
1162
+ " var inds = s1.selected.indices;\n",
1163
+ " if (inds.length == 0)\n",
1164
+ " return;\n",
1165
+ "\n",
1166
+ " var ym = 0\n",
1167
+ " for (var i = 0; i < inds.length; i++) {\n",
1168
+ " ym += s1.data.y[inds[i]]\n",
1169
+ " }\n",
1170
+ " \n",
1171
+ " ym /= inds.length\n",
1172
+ " s2.data.ym = [ym, ym]\n",
1173
+ "\n",
1174
+ " // necessary because the source.data mutated in-place\n",
1175
+ " s2.change.emit(); \n",
1176
+ " \"\"\"\n",
1177
+ ")\n",
1178
+ "\n",
1179
+ "s1.selected.js_on_change(\n",
1180
+ " 'indices',\n",
1181
+ " callback\n",
1182
+ ")\n",
1183
+ "\n",
1184
+ "# show the results\n",
1185
+ "show(p)"
1186
+ ]
1187
+ },
1188
+ {
1189
+ "cell_type": "markdown",
1190
+ "metadata": {},
1191
+ "source": [
1192
+ "### CustomJS for UI Events\n",
1193
+ "\n",
1194
+ "Bokeh also has a general events system. All of the available UI events, and their properties, are listed in the Reference Guide section for [bokeh.events](https://bokeh.pydata.org/en/latest/docs/reference/events.html)"
1195
+ ]
1196
+ },
1197
+ {
1198
+ "cell_type": "code",
1199
+ "execution_count": 17,
1200
+ "metadata": {},
1201
+ "outputs": [],
1202
+ "source": [
1203
+ "# from bokeh import events\n",
1204
+ "# from bokeh.models import CustomJS, Div, Button\n",
1205
+ "# from bokeh.layouts import column, row"
1206
+ ]
1207
+ },
1208
+ {
1209
+ "cell_type": "code",
1210
+ "execution_count": 18,
1211
+ "metadata": {},
1212
+ "outputs": [
1213
+ {
1214
+ "data": {
1215
+ "text/html": [
1216
+ "\n",
1217
+ " <div class=\"bk-root\" id=\"a240e231-c73a-4432-a8be-6d51807b2fa8\" data-root-id=\"2321\"></div>\n"
1218
+ ]
1219
+ },
1220
+ "metadata": {},
1221
+ "output_type": "display_data"
1222
+ },
1223
+ {
1224
+ "data": {
1225
+ "application/javascript": [
1226
+ "(function(root) {\n",
1227
+ " function embed_document(root) {\n",
1228
+ " const docs_json = {\"a5664bf2-96c4-4385-9dee-f4f890edea9c\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"children\":[{\"id\":\"2319\"},{\"id\":\"2320\"}]},\"id\":\"2321\",\"type\":\"Column\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.6},\"fill_color\":{\"value\":\"#1f77b4\"},\"line_color\":{\"value\":null},\"radius\":{\"value\":1},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2313\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"2290\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"2307\",\"type\":\"ResetTool\"},{\"attributes\":{\"overlay\":{\"id\":\"2308\"}},\"id\":\"2306\",\"type\":\"BoxSelectTool\"},{\"attributes\":{\"icon\":null,\"js_event_callbacks\":{\"button_click\":[{\"id\":\"2322\"}]},\"width\":300},\"id\":\"2319\",\"type\":\"Button\"},{\"attributes\":{\"source\":{\"id\":\"2312\"}},\"id\":\"2317\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"2427\",\"type\":\"Selection\"},{\"attributes\":{\"width\":400},\"id\":\"2318\",\"type\":\"Div\"},{\"attributes\":{\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[2000]},\"y\":{\"__ndarray__\":\"JkqUQwlUWEAzlM6HtP1BQFhdgOixFUFAOqeExx5HWEAqR+z8TcJTQM6AXmQLxVFApPtH9JMGI0Bi3HkHpOs3QFy0AbuZPSZA7j/d4MX8/j9rHbuiU4pVQArggAMhylVAD2fLKr3WTEDV4YUqbWNKQI4L8puzZVFAKtMhBYwDVUDtThhFG60sQNT3PU6Ln0pAIQtO62p/VEAxcxLN/uo9QKyPIHFlWEZA8d4jQQ9gVkBI/aKff3JSQJ52lSDHN09Axp2YwrtGO0DkdqjtEiAhQIGudiJaGy1AIG9MQgdKUUDa9vppSA5RQNwuK/+ftVZAMg5Oz6BVU0BdqlH+CLRWQOaO12teHSVA8OhlDIobUUDw/PEaiVhNQIgnDfFoYFBAGKC6pdJ3JUCEOeQY+QdLQES4wzvLrEpAi9nXKooWPUD+tI1Exi1FQFNdfkjXXVhApzOxdGtSREAPQROEPLVCQMoX83hkgzJAXjyittFrV0AWKVKTZnoDQOfiZaTEfUtAGlTM/nyiQkCWihGUDB5TQIb4z3wAAEVA0ozlyEzqUEAlAFCtw1RPQMukNpqnUAxAVIky/cxdGEA1j/0pqfVUQJTM0co0LEhArjywOJbIVUD3nofK34ARQEkee10exlJAAqdIL3w0MED70fuqB1RJQFg0CKM4D1hAd8f5SpiPTEBeGCfNXdwtQMy2qzeR5j1A7t3f+oAkU0ADY25x8o9BQJPYujzhAEZAv9R2L5UUUkDjiOx0xTEpQKWUa2TSiDBA37eV7y0HM0AlTQJaEF5EQMi75knIJVVAIS50WjXbQUCanh0v0BlVQIO664XNsENA1PSLWuHqQkDxDcsrMq9YQJ5d4IxHD0JAOtnBC/uQJkCKNu2a9acyQFxrJQn4vVBA70uLcxMEREAWlbvdNiI2QAaMcALXoEVAnoPUJujTUEDBLuXhYH5KQKcijDbbuVhA8r5bHH9AN0Cpd80dj2lUQF2Zo+mtdTFAfC33l0GeN0CKpRLVDRAgQNzoiYlJJTZAxyxxmaSrV0CtZ7YfxQJKQFjN/QlSjkxAwNtZjkhzU0A1HwpRue4mQJIuwBUnRkNAN/YIbQlRUkAIGm1AMtBPQEwosKYhSEZAo56daVVHNEAYn1XRMp5IQNBSDlkVa1ZARU2tDxOTT0BqKcR5ygZTQFSjtiS9nlBAOzkAdzc7UkCBX7yfEFtLQL/FUjWeLlVAqBx7yVFSRUCiMdQSSjxLQHCPxjEEyBBAfdChnDZ3TkDmg+L3LqMeQFqNbNZXH1NAlvmdHDYOI0Bg3VDV4M1UQMw9eZgckiFAKAp8YsfdHEDQPiaZ2R5VQAalB328HzZAkLjk7uAVQUCx4SOOhcoQQIyoTyCtt1hAyn6GPNi9QkD7dvbI9c1YQBmaF7nq2TdAXIv2Y8jkVUCemzBbKs5MQMY7dCNbBE1AkALBTmgKNUAgMsG5+7tIQOoxIE7oQFZAyXpIuDqSWEBsIvHLD8s7QF5e7yg8JUtAFBSEoMu4J0BPn1n0BW1TQGsBNW1chE1AIv1JWt42WEAFPiZkx4xJQEdg+gfIR1VAXi+BfWzNOEAhyrU8YrNKQI02iPrJ1lNAfnOwlAWnREBnOgAzrr9BQP3lhF+NbBZA9CUi3dvMEkDYaQQr6hkiQG3OQBW6/ldAasTZdulsQkBy1YZ5PzhQQEuG+yjWg0lALAGkKKK8T0BHkztSUYUgQPYHisM3SlhAZnmp+1t7F0CjNmI/APZQQBhNbRwgWhxACAo+TmeKS0ALakL7lGBVQL/IdaG14TVA4MC3a00xUUBPbMI4fwpOQHZZMM1tGhlAo7Gxq2gFREDFrwat7Y9UQFy+WwPC+zlAqaNp2jNULkAQlw99fKY+QBV6jNiSGlNAMVJZFLj4WEABH5za1hZBQHOXbxxIOFZASEQ0JAkb2j8njaRXF2pUQHo6V6ZITvE//JnHKWvbTUBtJWlqwBNSQDxpzGDdKS9Ay3jJo2kHVECEf4Bn74FQQO7UOIQfrUBA9qVCsUVhUkBh5LF6lXI9QJaPc2pVajtAWA1nSVoEREDkT9OUN7pNQH1AU1H1rU9A3OLB8H834z9LZidwGRJSQJNK15kzqkBAAEUXXqnNKECSR5ffBhVQQKT4J9wMHAhAVdhP1Fq8SUCdHC6vkRQ3QMPsHddzGFJAkQ3Hhy1aVEAJTcr3iRNWQBf7kUef21BAMyNutLFQVkDbi7kyvehVQBzeXJRh/ihAkxWcyCRgS0DYpuyx2ZhKQDc5mYch+1RAQHv+0zh3SUBhTHHRP+9AQM+gb+hZuUFAPLURsEekWECmZOaIfDxTQDlKYDRvtVRADOCtqgp1OEBGYV2L13xMQFeJ6mAbVUBARmsVXfjASEAaRg6bf+RJQKXiB6VrvipATPK4LiZyJ0C7IyU5M0A+QIRMbVDnty1Ayz6edBdlREBQx+FnSzsWQPPmtB2Y20pAg4PE9AaBRUBjq4a8kltYQIpsb/BlAixAfqBpOVB6P0A05YOF0lpHQNIww2Zyr1hADIl6Ari4TUCA7CX/is80QM/hRhOQYz5AMO8p0HWXWEDAll0k+rEGQDJ5pBYBblFAcF8zLWz3V0As1I2UiaU/QJyYzu2QsVBAatSN4B9/UED4pDEu/ShUQAm99NkeiFhAJsDcQ7uNU0C6BGEXo6cRQPkNxreYDzhAwVHhqLlMT0CSq4Hoo9RJQBTRmVnk6FFApbyLTGzEU0BkSdNcvPVYQDHuwO5F41ZANCtgUwnSUUC2K5/jm4NEQJenV/sxg1FAFSQwpCanAEAOPeqTrvs0QGB2vflkDzpAtv7fMFS4GUDq4UWIwFxVQAPTOHPKnkhA7bDPuwX7U0CsOpXiwQM4QGXzAYCLyVRACrATdYpXUkA48sZeNv1PQNQWpCFltFhAZfSEaBYnUECCJSnJlSQ2QPSyUkWbdz9AjjL3U8ZAOUCA1chdsQVTQOH5tmUclEZA7efHt+dMUkCWrNiw7aFWQE1a4jhlo09AW3KJNltdKUBPvARa03pKQBceND1s2SRA/krNcZofWEC9BT4N5xsoQBsZLIeWaBlAbbq5smsgVkB9S1NZss1LQO5Ffpg0FDpAxzgimVhaQEBZfYr0ZYQ/QBVCXtvIb0tAFBpNp36DWEDhu+jLF75QQGyhUuF0HjFAsVOH4za1VUAWhzdcJ85DQEiT6BOhN1JAIe8N/ISOCEBueL+khCFKQNjD4pw5oFVAH9J9QEyiT0AUsEto3QExQAV/SdRWCFBA5G/MdaSjUEAonvZ2iacfQGRPJaKn/k9AjvsnZHYuLEBdL7OdLohKQDbNN0Qhuvg/vLoq7b/UN0BdBGx1ySU7QPOW3wcPP1JAC2ta8vHIUkD1xhLh0alRQBiRR/4Bsy1A25/3do0sNUBAcB5shkNQQNtsC9LDiz1ADR0TsJU3QEAEKvGjR1PvP8HUT+jZs1FAiI7qEMv6FkAiCMDjrUU5QAo7wojd4DJA/MS0cZbdSUAEW4J7TYlYQGViI5Bu3yRAW0dw6ybAV0CYv4TDAaZUQH+VPE7ZrlVAXKDFBCSzR0CeQ2HiwLozQP37d325M0VAYz/J/9R6U0D8EbxymjZDQFGhXhWdQjVAWbcvOo3IVkD3CuYeMFpQQNbTMloMs1BAlOVcFP2bQkA8GvXpuRo5QOZ7gAUdfjlAPdOKQhyMIEBezH0m9IgiQC51MdfBVERArZ6+4jZOVEBYQX3D8+FAQN5HGTHpQVhAtr1Yao9P9z8/a5YPSWtMQEoExHEk11FAJAltGL77SkDhRssTxsBRQED8cdtARlhArAdTHfflSkCOUrSRe5xPQNf57+rxAEFArH4q/nduHUDXyspKR9VXQF6Lv/DD60xAlqRRH5HjVECOiXi7s4tGQBiC0UKOzFZAhQZiDWAZVkBW/O3EtL5WQL7BEbbQhVFA1qoOrhb/TUCs0p5c8r1QQN9l2/rylkNA+hsVw3PWSkAhqsRDfFBIQNHa4Px6Mk9A2lW8Ks0iUUBuMbNiKspQQO0MqdvkVVNAJbPWS+ioJUDHtKrFYY1NQHpgoIM93zNAzOrqJfudM0BgU/A7rJxEQIhMirs4FFJA8TAVam7rVkAeDCz9wDpTQMdJuOWmlFdA8TgmcohhVkBOqk9Bq936P9Z04FXXGEFAP41bobbDR0CPWTrXobVSQPfFqtMpPlJAjoIJCu90UECLdd+R8vhEQFA5I+Zq+kxAaA4djGdER0BqbP6GCnMhQKWIK47D9TlAF3D9vkP7HUCorehGxk9LQFr3KyqK30pA2xzBa9H2RUC19YDUoQk8QHQII/bbaf8/wtMgEQZTRkBIVm82i9tEQChEX4T1+1JAsohco+EdOEANIPirZEU7QM2lzTqPKEdAzVEVtrU5I0A9Xdh8DndNQEh97x1BrExA6jTWiBFRUUBaU/HtzVZWQK4xvQbc/kFAisZyUhwVUED+YVkux41NQMRaRzZFSyRAO3TpuUGOPUBTY5+GxzUzQJSh91wxLFdAOQY2RXk7OUAYkwyzt2IUQDBJUk2KqUlAwVqRPE2qSkBz8g0WqHtVQDAORfqmHy5A71wfy7/LSkDkaYXEa65JQLOWS2Aaki1AGgMH2rcYQEC+m8/GjbhXQIAZqFAA06I/6jya9bJASkBN7vO39WlIQJA+6EXoUlRAPaKrg+vPNEDiajvSDSZTQL/0ygn94DVAHtWmqGTQNEDkoZ+gxBM6QMP6ZTnfZUZA2LmOdLCoL0CNVby3mUFJQBHqiLDpTktAu4mrGKukTkAcHJbRfjNMQJ01DbbZNUhArOFMFa7lVkDSuuneYDc5QH0YQzrwLStA3N5FmyUrVEAfbBnsI/9TQIjZTyuUY1RAb5MbN8NtRkAGOimkAHxKQP27t1PQ4VBAhx3/DI8fNUDUJ5beze5TQBlk78hFbEhAHN98zMYKVkAySEPi0KdUQHwncoeKqUhAm/48QRHTUkBvn8gnaG4/QFzIPrU7f+M/GwhdZ9JLN0AhCneT5o48QJK9qIUncExALZavhbPbVUBiXyoJ2hlVQDBp0J3U9ek/ouEcpm97VkCMumLB+ydLQKw07UEGbUVA7BiFM57yKUBQWakcUd5KQPDWjqnqG0JAJm2ju3UVJkBLd14rVCNEQGOKNnulX0pAQFNVqw9QOEC2UlUyuXIyQJgMxhQ+aFVAllmg8KZmUEAQORi9DyhVQF3Clbn47zhAwWzmSgGWRUCw597ZYk0VQOIAFdpgBhJAE+IIx7DuVkA6hur8CSJDQIOlQ+KvJjdAfWcuAnlgNUBbs8c2Xb1MQJ3Np9KGdVVAyaXHRJeRQEALcrbFNCY+QABU8eL4fEhALVhqQ4OqK0CzDdrip1pNQLtMRClstC1AUI4+U9v+MkCT2TduoVdUQF9e+iI6MlRARv2uO6OZVUDMSYSLLMpFQPyyhMcmaTlAez/Y4WDNUECHwoz8dkI1QG3CZa/yQUhAT+74dsXtSkCnbXzyjUAMQLxUrTXJejFAzz9NoTJZWEDFG9Fx89dOQH/bK3sxbVdAq3FCTdX5SECr0tRrIu9YQBpwc8SgGjBAIPM7AftEV0C1RlGlo3A9QFzgSAPRik5AUK2fvU0XOECSjI/fd/1SQPphvwr/QEFAJu4NtReGQkBO9hzbVqM8QHMjShcsSUBAUAoV5PWHU0AejiW0CpBCQExcDTI9CSRABhtu1WuHVUB1eYQfVbxRQA/uGuIUwzpAfh4HZvqHSkAZ1WRvHvNRQLCjmQg1SQ1AAgCY3cBDQkD82/OegTYjQEq3JmQVxlNADTkoWzhRP0AJaje4fUBPQKRJoKXo4ENARx5W+tzvV0BL762KyTYzQBg4M4G9Z1BABKhzgWZ3P0Ajt9arewNPQIINAhyMYVhAZOAa/X0OUEDSvPiBjC1CQNWgxGr040BAIpgujIKNV0CDBwRbxxNVQE5XmaZnl1BAVybd1eR2R0BaWe3ysd1WQI4kEXXsglBAFRVULcIbU0DnEDBx/phWQH/f+AZwq09AIZMDBWGsTkAJbmgHFsFDQDbBmtyrZCNAg8Z4JUVYN0DQOFimKyNCQADUJLTPZ0dAK7ZHVlloR0CV5FgPdngiQG4WDm4CSFBAWiV5CGSdSUCDP9zj1M5QQHHf+eybYSdAjDSXdW/CSkCXiYxavRoxQE8vhPtNF1NA1YAKReG7V0AmwkAlledEQA5QGPge/kpAFf+XjR6LJ0DMYCGlwExFQPEgLYRRLk5A3XgwQBZaUkA02r6WH4BOQFOQ7yVFuFdAlfVFMy09OEBaqfYCACVQQPp3BuPiI01AKk5ccHCdTUDFins1ABRVQKTDp93HIUpAxCY5VHraR0AJUm5TPfBFQIdQCG2jDUNAosCDuVZEUUCZTDTC3gRCQBHiKrDPuAxAUWHciSWxPECMq1aO+GRSQCMMg0rW80NA0rcugXwfV0DHZemLixBFQCjdyyHEu+Q/jQZ4MyG7TUD3fA42k0tUQIilG/F/Z0pA3F5xE0wNV0BF+NdkRA1VQA259xS03FNAFdcnvpm0MECoOC+9KsYbQJ7RYC7XJ1JA/r5ZvAMjUkDbh7R6WOo2QEN+GlMuKUtAUo7iWE0PO0DTD5ujn6RWQHqK7vTbtUpAdhxAWvI6L0Bwf91CR+hAQNRN2RKcH1BAmsYRC5OuIEBmqf4YqWRUQA7BW29rIiZA84/sS49FVkDV/fh7KL1IQIiZok4a3FdA3wb4aKduWEDF/OCVSmk7QPF5H7dn9VJAA0azVrX6K0DVhbtBOA1YQCAqWFtwskRAu09ab678NUC0sKy8hgxJQJPkKBnn+UNAg/PpwPFMV0BbbTYWpZNKQObyRYoWJEpAQGVC16CxQUDxnG1FvGxJQNOU/zWFuDtATwcMZj8mUkDcyc8wXID4P6Y1nf14R05AUFc4ClqoTkAnaqVPGQksQAJKVOFpaABADab1QPiYC0CgQ9Co7LJUQM6WZpwVW0NA1jjY+8xBU0BkZ2lr+ZlQQC6rBMm/+SBACPz6dSvyQUB6ht3kUekdQGI8Zql/YktAb/lGag58WEAGKZOBji8mQCPL3SUKHVRAVRDmDwIyJUDbeWvUPQJTQCYsRQkWqVZA3l0KQkneUkCNFxD8YAQMQKK1qQqCLzxAcPa8v2DJPkDaRRw/vgZYQMOUR3vHISpAQdHeiF9bUkDlXj90Sn9WQC/izC26zktAh18/XoDyV0CK+++N9ecyQANKyJ0Gz1dAVBseMAb/+T8s4HWVgpZBQNxdvxrY7khAcupuYQ6vRUB+RtlV8qg0QIIjoAz0ciZA+dk/1s+zUEBMf0Jr4ElUQHY6GLYkJ09A2xSJTqgnNEC0hsVo+NVLQKDVpc4KblFAHxUJIq7cJEBgRCcnnPAzQBXOB4lnJlZA0UCyAhBqKkDinQQExbkiQKh6SOPwpdA/9P22WB5tUkB2tpaub4tXQNN1JNw+6U9Aq0HfquzVUUBQCEUTWrowQGk2uSZpq1BAkgwNSy20A0Dlq4Vp9rVTQKui144MVVdAM90P5QXHRUAtb89QpXhXQAZhUrxqP09AOc3vxPNCRUC5Ama+f14yQAJon4rQqUBA+oaFHmYbU0Dl0LLc4/BGQORDAv1OmxhA/Fjv8RDmQUBowVYfUjo2QOt0oSWJ0ABAIimbdI68VEDP0nHopZk1QIpVa2bVEyNAv+SrYIZ/V0AEL/elvIJXQNlajGqAXkhAGRrGUF5LMECqGg+ixXw7QATvrGS7BFBAKB91TZBiI0BnMR+AIOZYQI8dimXbllFAam3XJOKHPEDz7o/KH4VFQCXObqX6xDtAAat+51L7LUB4Cv4/cQdYQMmFIWmDlERAUCDhRoGZ8D+WABLmwoFOQDVIBgTWUlVAnG00Fg72NUDDfrFgybtTQAD6AcD4YS1AB4gMRmaUUEDihZULzCJNQCLAPUuJm1RAuyUrOQyBCUAyMMixEH5HQJjBgLBsDzRAdFd7rwOqFUAwYyetpkkxQJ4BXHtvzxxAmcRGgQcdMkBBaO5UImNRQN/hHHY35lNA4Zxs0w8ECkBsu5/hA8JVQKb5x3jbIkBAqyCKnBXTSEADhRCspftPQLYVPDJ9JiZAzZ/IWqkFVUC1G0/D6EcqQBN7518K0VVA4x0INpyQT0A26iyY/An5P8vh1hJI51NAOPR19Pd5RUDm4BB238YrQJjKdR8SuvM/XkgfZBJKSEBjjBoqfqw3QI44rNx3YiZAJwe5fS0JPUC2Q40HAGY2QEJRRZMW2QJAAUwrWRx1RkBAeWldDmFYQBSzAOAh+ldA6VrD4GfNPUCly5KZNR0hQJOHy8Y9bVJAjU0yzPUYVUBIxzA0/2dTQHwr7OcpkVZAkW0EOMYnT0CKkFbWbKZWQNreVgvAY1FACk+78kjiU0DyvbRRfqhQQCmq1mWB8k1AwI6Ky7qlGkDcAzdj8UM1QHrKWrhfj0BAKWteFlIIUEDH2WiNAXUzQMXtuROm80BAcFM0f1YWVECS/0ZoxHo/QMGgPBbt7FhA0YOmuDU3VUBLZfLEJFM2QCrrPTdTf0dAvyCelodLSUCosYis8BZYQOt4/qZIoVNAsOKgNIsrSUB8COoVl5k3QMi9MWhPbFFA01ddbQfqUEC2eETjGZVSQNAdWcLNWlhAFj7GpzA9GUAFiFlDw/VQQM/ZPKaysEJADbvTlnnfSUBd0rl/jihJQNWYrVz2BURA2IdvdQkhUkAKUfRiVw4zQIaJmHiE80NAImdh6O3vUkBD6H7iP3M2QLQa7Ct8R0ZAajTLD/zXPkC6+Ga/v+1XQNfxpB16tThAXX6GHYm4IECrrgzLXC4yQF24o/O7O0JAWaH9BJqEU0At7zD0rpBNQCbJncGu+kBApzYpcvpbVEAP3bEN2shXQAl/+VjWpEFAbucqgVV7REBRnolmyhBVQHTC4sL8LTtA4d0hjrw7RkA8qMwolcNQQIb9GTH/OlZA5MiKV6PNOUBqMdiMfHFRQJdojXmQaTpAKh3WT4OYTkDCbMuVLAkCQAjcv3D7dk1AXYGUM2QaWEDKx6h/BYM5QOZmLYOHDkBAZHbXNmj3VEB+Si/7xWU8QDZrF/6uKlVAcNHeScKJRUB9qRt/8QdEQEsIR/QIegFAMsf7M5SfLEB32cdBpbtAQFkwK1GHr0dA49NPRsDrVUC3aYK1+89HQNf0x4AZdFFAdATrklRkVUAVgz7IU5pVQNXAWbWnJzNAiN9pduRt/z+u4VOKxnhWQLof3+FO605A1aM+HAFCP0C4xvMob3hRQOLeNVzMdlVAFLEZxmejLEAf322JhodSQKgl80VeA1FAAAoUhb3QOkCDUYMgsl9EQG5nePEXtgpAns1V+NFONUDy4qO8IxFYQFE/n/IOryRAk7WMApd/OUCfJIjJnMEoQAkA/tYv2lFAc2krMmXkTkB42cFZOPlCQErAtQHLcD9ArhBR3jQeUkDpjiDrbKlJQBxUsbJfk1JA6gKuMiuBVEBlGGYTn3hQQASAZBzOrOY/Cu8kTHgwNUB6KchvVeEyQO7Yvw9pQExAqSrDJpEXSUCjHm5v04FRQDioI18yJi5A/nfemhE8U0DQ1kmJdHBYQBj092C1hTdAO2AVwXpuVECabk0Hqi5PQJBsevWFDURATnuUgEGPUkCyfTDaPw9UQIVHS8owVDJACSAXSUiMJECESx7YvqwjQHiPUAg5GzBARFLbtahS+T/I9BKkAWxTQC/dj+AUKExANuVcMcGlAkBLyNvN3llWQNWOB+uh7lJAo8bWHUwbSEAWapPYkkg8QLWcuTltqThArZ4cCYWHRkB47aarv/lUQKQL0siBoFNAuM++mWqPP0CoSnTRW7VHQA/YhlD4yzFAp+QYOD2XUECVDhQVRiEjQBzDDohgC1RAWkLagbczUkB4lVcbBqRSQBq+i1G8A0FAES/4UVPtVUDBJB0t2jFOQAwPtpAw2lRAyOYFGU07UUBV1mj3NrRYQKYZNzeYqU1ANPmL/zq36D/f4f/Awz5WQEzou3ufSUNAhsfDluVjUkBEkJJuJQJUQLNguq2DAlVAhn6NWOGbVEDV/NRxUyBVQM8+1+X7MFZAVGhFLGGaNUAl0FaG/XhRQEk9dpehqUJA/Io2XzXRWEA2cnQBmXJEQCrzIFK5AEZAaQax03E0V0CCY53+0r0yQF2nZZvLOkRAjMNM8GIGKkBgMEmbEelOQEWA00yh/FVABTcC3GVUHEBB67Av+eRPQJATFh7BKkFADrwDF/GOV0ASb6i8lN5SQDom+CXAHExAd8uwALNXVUA5usAn6ERQQLae4u3go0FAaG6QW6IG9z/8MUsoLxNNQFAtjGGIbjNAgMSEwIWuUEDo6qFimsZBQGvfPWREQFJAfGantc3kRkBpRsq8P9MvQBqYrzJDRT5AoEBFsOH5QUAKFq4yKJknQGCvJtIbeDRAEpbc5nMWMkAiaUc7MhVXQPTp9tvAkfA/giDNYQ4JRUAhftSId8xJQKFmdbAw8lJA3qaMoDI9UkCHir5nI5pSQKyzYhhv6lRALVFimQUtDECp+jcaTEJVQMymryDAS0xAarfypcKxVUDyIR1ju/JWQJa3HalmGVJAe64fsuXvRUC2aao8FpFKQPi2KwEvZ0RAM3hASKe9UkCgG6HaSnBJQMm9gAKEw1NAHl51eSteL0DiGAkHPbszQOajSfPsJUhA5vQkUAA5RUDhsXjYEv4eQMK/4fCYe/4/WdcPSUHBR0CJO+MJ01ZNQK7BAQb0ejFA/ugKSWAtWEBc50XfdssjQDUAG/mUCElA4ysPdAUAM0ATTQ8LNeVOQLlOMUkePFhAGBJWcSjdS0CD4i3ZPHVQQH9bXNMgzTpAxHoT6HLgTkCMaVwfRwBYQORQAyDDNEtAdueO1jBlUUBPYj6dLc0iQNFmYNO0XTxA8sKe5BBvLkBQvQcw7nYZQNOaJoMY+FVAfIHRAaeMUUDxuKkn0SpMQJ34q5lPwFBA0tjQoI6LV0BhO4oL+JI2QNIf5eaWJE9A7vNHSoPkQkBUU9xKN5QyQMxi+o1oBlFAhX4ApKZ4S0D2sNoogWtQQOGzSImh8lNAtOjGgd5aT0BWaEONMRBRQIAQSsi2mUtA3T2He6cwM0CnbLwWbEIaQDjGrO+Ptk9Ad8SFdqIEWEA7d5CXXalWQNkGEfrdQU1Ark6U3HDRPUCfusEtquwVQADDlZ+77UpAQ9fFYYtaTUAo5b6vsF1UQM8Zo5E6tlVAs8yamASpR0C4+upiJZRYQBxUWyGU9kZA1IrblItmLUA5UNkWsFQYQMJZMSPH+SZALT8HfwaPQUDEu2KBoQlYQHp5maNPBlBALezTfueAQEBkAxAq+nn3Pz+9uWfsjB1AlflllmyBMEDgt8MmVrxRQCM1cjl8YlRAFOwTCn+rU0Dv6sc0YYRWQF5kr9UdEFBA5Hq+mYwCNUAzMADBUDNVQBL7H0x3FChASpQISB2W8z8UnDPN45c4QIRZ7JptszpAMBJIt640MECu7PW2CnlBQLHT1aRNuUhAsPkhIskPRUCC0IzCb65YQPY8TWW1ozRAxUNf2mZeR0BfuzEQ+6ZAQIpCifqzHRJA3nwEEDcuIUDmD4rT1jAWQDdfOIq4klNAlE6wvtQ5QUAAkSD8OehJQIlFo4S/kERANGJU2+zzQUCHDsJiqypRQGTGvKZeyElAROvz0Ue4HkCszr4tbQpVQErRQG5oM1hAlnHREYP/P0AeMpUj51HzP3l5Hy0J6DBA+ZL6irQiQkC0CJvK/WBVQD/GUuH8/hVAMn1XQWDxO0DMbaGgV9xYQBbF3yfu1EpA4n6nk7nuREB1xlxZCbQ8QF4xAH1OHSRASyK2tUYxVkCUKU8qtbBRQIU7xn+K6ENAp36YhNJSTUBFEygljP5PQHfCfejhnC5AfF18RcmPTkAyIa0e0S8wQOu9IWz7W1hAtKu6bDVuUUAAFmLq8Bl6P09M91WlVEtAH5vLmSwhJkBLn2g17vxMQJCbI3DWN0hAXYkHTM+BUEAwfxN6VwYwQBCKkFcZ0UFARFBU55kYWEAemeCrfQEzQOx4J6Ml/lRAjtwmCGNlQ0DNH0M0aCZTQJY03Yc8REhAWMOXS9lML0DA9VqWq3lVQPkXzqd5mzZAyx5CWnkfQEAjbvjrj4NPQAQu9Wb+g0pAdxIcRvzvI0CbqwtMDB4pQGOhw94JM1RAHrVhkNU/VUCfB7teZvxUQJvvuP7+QFFACgtXsfHcREDmQbVw02lYQIFn23GICENAfuZl8HdqVUCQTtU8lgxQQCEbeg3W+VZALPaVdKaGRED0N6pb9m0JQIVNAEg2L0pANTz1UAXKU0Df8XjGFRpLQDiv8lfKNkNA+wuiClnFQkDTw+tAZBNSQEXWIz6HfUJAj4/2W+FvTEAOpQcVQCFLQF47NbddSEZAl3fraUVZNkB1Hsb8d4lOQAVp+PWIDVJAgUF5uMjrPUBvij//tUJNQP7UE3hzLVJAhfaH0UgzHUDCHWmYoxlEQGllLINNnC9A1fSoYcfTQkBhUhtAji4LQPxZOlHOw09AxosA48pWMkAkoG1r1gwtQEhZxR/iGlZA+1xyzQ5fRkDIlR4O4E5WQJwvaI0IiElAZQircjQdUUBiqb/H1FdRQF7mni6OPk9ALSP+DmI7S0AuCjYZulckQLCSxrNovlhAN60l+ul5NEBrQI0VMvtVQGzk4C3aLVBAojw2RdU5T0A1COWI0+dRQIWErgqOh1dAtxQI9kQWRECKDZcJoyZQQJX/I5CtE05AnjBaywMHVkBPeN8jSXJWQErNLYIwIztAOJr3F1nURUDefQeWZ1A+QHEWP+dAr0NAodfVnaF1IUDGIeOvHRJMQCW8wK+2TlNAICykRar1+j9OBb+ah7s9QLmYebfbtytAfkiNyyViPEBa27Df04YiQHTF2BzrTFNATB/CacfMSUDnO9LrwHVAQAoPEak1CldA0V8saVw7TEAYBOKHYOY1QJZNnTGvM1BAbrpyimxFT0AbMWxuTjZOQEQLqSjsvhBAgPZk0nNOUEDWmI2FN6wuQOtg3UXp4DtA8TYdBNN5V0BswitZgM0XQC2aDue641RAyTVC7zklQkAIqjhH9ENUQLrc0mMytFJA4kivQtrRUUD55UPLpnBQQIVujlR6YDFALbXYO6w8T0BDXX7scVBAQCNEWeDTekJAET4iaVaOUUCqgf8jqY1RQG/RqBHqCFRAtAMZ7skmNkBmy0p3VXVWQNAuX+OcwOA/qgP9ggu3VUDoVjNcLHtDQBPuNbVWqUFAKh3vAST9V0D8EvZTDkFRQAOCjR+gE1FATkyTPpcdJEDworjiQeQ+QMayxAHsclFA0DgwhYRWLkBWzyEo/p1CQHjkj963uURAJ8kgnVRLUEAGfLXrTJJIQGZ/pUpeQ1dAUDPeXQAiN0BI0j4tAjQ6QC89y+81wFNADdCWl/t7SkAI6919WsRLQA5uQHoNw0NAZWeddhOjTEAyYN/4GyIBQDydGfxzquo/ahfL4C+YUUAvfUERZEBQQDL6300Pr0hAPQPg0ve9TEBUdh/Tb0hVQE+TgCY4Jz9A4n0kmyZeUkCIph40UPM+QMAD6bIgAi1AnCpLiRE7S0CxKRVocJs6QAZf2SldGURArjHRFkAHU0Biftr7brgmQOUAymVR3lhAteJ1K5wBNEDfYNQmkL5NQC2TpAx2glBATT7SV/QCM0Dxow9amiBOQDvVOI2fVEZAozze6izvWECdOYEeCRFLQPtwWNzE9lFAySvXJq08VEDeoxOSObcnQOrp9f2nHzxASiyxNSBLVkD4ObYTnuJTQPapKStXU01A7G8ig3AaQkANBUyKl1NWQFaNDTPG5TdAbf29BwQ0SECz48yxZ50oQGnuRO7ZJjlAyo5qG4ThRUDQswPEbH0rQHYmcohmIEtAROA2h2viPUB8jJMeRGcjQIoA5ppqgRVAsbyc2KSUSkCM8yUWNgowQDK6lMDl9UhAiA5dNfepVkCQqhAzfvg5QGKwi/iciFNAZjikB2/iP0CMoVmhmBEvQNZ70yJf4EFATOH+YD6yT0D0ebo2BF9IQOdKSfvOn0hA0zyyIa3pUUCU7TPKpUgpQKxm55GaNlZAWVMvYeBETkCIC1aKrsxKQD9kzfZZ/FRAqWOOnpJMVkDkOu3cGJBTQLy0gt7ilkVAtTvdUCaQKkDthUgBvMlWQM9ytkaZtk9ANo7ng8n6REDUyC2SLSVJQBSOMFiofUJADOKeH/bDS0BDFSbnIVwiQLe8/IoTUVRAqnivl4J/PUDyQi7ugB5QQCbC/bt8Zj5Aa40c+7F9VEA1aTgOLNgsQMsbwVnzVU9AI/vBUdu7UUAoZz932ldIQL6eqeUjP05AwbBpDlrfS0Aw1tS5gQwtQEAMdxM471FAI+16fuRxUkB2c1tKTHA7QAir6xk6qDZASHWfBwehUUAIOQBQTVwdQJ2DTy0aDUxAnVTAcFDLIEAK3qoi1KUwQJLflunUsldAEcmalxL2R0BC3PVkBtc5QExc7T0J/VJATIWqjg+iOECxd/QHxxo/QNIdo5VmiFJAfPsD6XZbVEBGDj1upBFTQMmO3owbhFZAFvwC6oPpV0AUW4vFAZxTQEKJW2R0zE5Ay8VT7GbQTUAQlf0jAaM2QAcfYXcK+DhARtCP2mz3KUBMnh3VOW0rQGJNDMess1dAkvf8Mc2PMEA61BUGHudYQMj5nxgEUkRAYSQgVB7UUEAW+sazOtQ5QJRl2DpEfEFAKJfJzYp9UEDlRYrTtTg6QHh2DUeE31JAKNGIVJIwQEDEPfmpBC9JQA0YpSEFFElAm1Evea6HUkCOx2L3HWVRQJKUfUZHJ0NA3rD1AehtPkDLfl6Fc5pTQCT1rhabaDZAkzBMPT8GRkCLxmo6kWxQQIRTKCkqhkhASN6ulpXBNUC1TWVq6nAxQOF4m/RCjThAA+j3KpnMWEBvUMfgedxUQCRmgnMeDUpAZ7jI3SB4OkDQTnsBwXU2QExA3FzHWFJAUxhlWVRIP0DVLN04wMtXQD1JC5JBclVAHJUmfyW78z/koPwzPKo3QOGLA1o8jkJAqraZY5bWUkAm36GcK6U0QIlDAB7F91FAlMzr91eyPkB7Jsr1BKcaQB5iik/OeVVAblzP3ueyMUD+fTyDiRRUQHyi80YufRZAKCG9YG8tWEDisCbpzApSQE4s+K/LwDlAr7AsKG6aSkAm3ZYzzN8pQLAgJ3ySCTZA+W5e08sGMEA5At8jkEYsQP3UAMEqdVVAKjCOUr6hP0BWblb2GUwyQPw9m0HqEFFAEY1m8euTAUCiFqrijAtJQJb6BRbYwSNAaGkZj1yGKkBzFf5AUwVHQMK1l2k5azpAf2rXmiyoTEABQANz7vhHQOaJGYEe/z9AZqfZlCRfU0Atcd4u9/lYQGYtXv1bC1ZAAkOmYCO7HUAx6eFx/b0tQGW2b5t/VTZA6kWxc5NUQEBHzeUIp+lQQLxQFUmqsjVA35FOfwO3VUANMc2JY0RIQKGFmFvosUtAr0Ue661sQUAiBPzQvphIQMVmvN6ieldA5IklcfX5Q0AATu1GBStXQHUGn1pk+ydAcnNdUcIpPUCvwzsUwSZWQJqUxHpd/SpAGlUDu1P1Q0DR6fNEzvNHQLM7HmC/wEBARq2vGo5yLUBM5JJJlOFYQICorBEYtwdAdcPvCOLYWEBJg6dGFiJPQMu8fNdY3lBAvd8XJXPXTECSpdTLLE4UQE2Xsl3gl1BABUpfUTC6SUAZWmvhDLJEQDPqd3aM9UFAsHJDCYcYR0D8O+GNVLxHQNpsV0bRkVVAKKHlYv3SS0Ai0upAevExQBFQyYWtcVVAUHLmWiC1SUBs2MDGfgJUQH1TISLwqDBA7Mg5h4AcTUBGvTzGxWVVQHoPh7vRgzlAOxqoreLKPkBzkFBAasA+QMEN3v9s5kZAOy9ihoR3QUDatKYtwZoNQHa+1enH71RAr7JFCZV6VUAzWmOob5tQQBaLXSwPD0tAouKX/hrvN0DAUMAtylJBQLXFgtiwzExASxujjagFUEDhvjTDhxdYQE+V5slXOExAZDKJPcCcREDI3yToBMQ7QADUDkuqi1RAhRf3mmlgR0BxOcc0qitHQAFQ9/SxTC9AJSOBM2KkWEB8NIIj2LBLQPkdzoZs21ZAQX29+IfJUEBj/YB1kvZCQFkdVOSUczVAdpFbBn1gOUDv0RklxbJTQDewFTAkNVhAls8+n4a+SkCaqTR+DWxFQBvfbhH1YldAcWTd3/46MECl+bamh0pTQEdq8/ZZZidA0FCc9A/UVUBDjjSFSKowQONrDZ9X3gRAibtecnwzV0DbsBeNqRxUQCUdRyqrV1VAEJCl1Q3xUECjAVbpsG0BQO2pTnVlBVdAnbKCLVBEQEDgnD9xZONDQNZLxiqSef0/ppRUgsd8REDxzuWrloBMQJDSVmKQC1dAnVve2np0REB843ILA4RYQNqbZWw3rB9A7W2nSp6MUEAFbPbNBtpWQM/d16Slw0dAwv6XHhGpMED731dojXtSQNsDSMUqzklA4nYZ+rqmRkC2SNtsZulSQJCwBM6VXDRAVBXPKTkKJ0Cmrc/94jBJQNYrYztR4UFAGEovL68NOkCmpO0Ax+JCQHJZNes0qURAcEGWz10sMUCONhL3bTFXQCy60LJbB1BAzR5Cf6jHRkDI76c/d975P0wXoIbY7FZAgIaPPtE/UkBWhj2YVrZKQE8eAVUeOU9A/rnrVe6gQ0Clxv+srxYwQN+hkSUibhlAW9WW3OBrUUDsNkHwa9RSQGyns+75RDZApZOEziR+UED9hM1bWw9UQCTRmvK+k1JAJ8XPjC6EA0BSAq2MAgNTQIylSnbgNUhAkQUb1ek4RUBM6MZ+vLL7PwVliWkcvlhAAYWYMrr+OUBFYwxSqVRBQIKvhjhuwFdAZG6tPe6EKkBcwL+u2zA+QCDuCknPvPE/KnFxVTpNTkBtSc9UlzBRQJKefwwBGUBA+k16d3lSCEAlRHAhjvkjQDo59j9V6DpAHPziTzO0WEAJ3kIaSANCQEGUUs7CgVRAqNr0Ock6G0C4l7mrGMtHQKiloqp+LEFA360KdXAZMEBy8rIstqM6QI1mS9fJAERAHiLp8obeFkBWBCP114ZUQF1oyDNb2DpAiJ+7S1Dg7T9iuFwnduooQESVveoiGlJAeGcr7YUXQ0DE4pz7BgEhQNE1som/7VdAh0VJt7ToIkD6I1JkMsEUQN05SVbxu1hAZmtn9P6bTEDmFRGzsPlQQIKMYmqb5U5ArueAkmrjVECa8eQJXoU3QE57HKYXEEZAC1oa0w2xVUAU/Y5R655VQMCVnSxClVRA5gUZTCnDLUCv0C5ljpVUQASxGJaCQk5Ab78FwnHOVkDGXGMxlopLQPnpmzxQZz1ANu92RB3lT0AAYv5BM80jQL5cuECFW0tAdOMT1qCCRkCGCiEGJD0vQOAZuT836TJAorfIjUBVMkBlbR8FYewkQDCzuStVPyZAzDUFIBAHUkDPCLoRvctGQNpSmv4TVk9Aglg7/V/7WECnrppGYptMQC6ywTgexUFANpF8EqQYPEC4pOp0xDAlQJHaojMErEdAUMpYaJJpzj8sTFm4g+pLQKv9mhQ8UzZA+7Pw1McsQ0DO08L6fPZNQDvftz3t4lFAzHeTVviBIEDatPfevm5JQJ4LCt8i1lBADXq7YXxHVUCN/jjpNn4rQIrTtjNRSD1AreXXACA3UUDIS/mvNl9AQGQiiW6GxAhANhOON+xgGUCm7K+Y27RRQMrIFxNQzhxAQ8MUuthiMUBXeRZst2BUQAMIOucixEdA5GVV849qUUByJRaXsrhUQMGEte/2j1JA0/thDteQAkAGMKvShNFAQMNha/NMP0xAHYaMb+6jMECHC6Bcem1YQGmqWH9MRUhAX0e3MLI5UUDsMEs36Jo0QJN8GnfMWiVA1xg1N3IDQkDgm3xKa+lHQETWXzHzxERA9AQiyU3LSEBVRk+BtBVRQBgVdDszuS1AzNjcp0oPUUDdDTc6uiJSQCg+grq5sTVABZwy24ULTECbopOj9tlXQKHrxXSvhVhAofSJ2VgdCECSL7Z2OXo1QADOpFRNM0VAQrQ/tTedU0AeaXR4as9RQAw2AO7bSldAoNW2MDx8EkDrxrxRPnRSQBEPKBhvt1RAd+EBu7UZSEAtvJUQfbhWQJgLAUQUFEtAL0L9dBtuQEDOLYAMRAFGQNr/p6TM/05AVaI2+zrmUED5Y5ZRaVNMQLKyeEVnUVFA9lCqnaPISEAenmDWMoEnQKn5xAbFElNA+ecwko/cU0D1Ifiw+6pXQFhkCgMN1FdAwBchmaSpEkAk+D9AY9xYQIS1q0/1sVVARKUpD8rUTkAQuR1FEPs/QA3zXbAxHy1AOLaKgIlIU0BccTgpPudRQHA1ZgefhT5A6C6QXVTLUUDbwLvOntJQQJCD+h35cVVARBZKfSj1REACBxVJHtdKQLb35165BCNA7IEcdrbNQkBKOXlAixo8QNulDnQOt1JAvuNzGK9kLECO1gWrZU9JQFhTGSkGOv0/tMCHu1FBGUCtmCgwrJ8xQI6nyyhzt0FAms7Tr3LLS0BS9WzmDrlMQE+1LeiyPEFAmGvQQ7GcQECqpX8jih0YQAoxKsJFcjJAPIq5Dr1iVUAXODSJkQpIQLspTi26lEhAl+5fPuwDQUBCFbOu6dg8QBYlJr1ZkRdASvnR7j+lQ0B2dsCd+8I1QAmYY+g6hFhA5LRm9EV4Q0CgT4ptH1xIQBIGiC60jlVAKR+UYrbmOUBTsjlpTv8+QGtUbaYdhklAr8JpddvWVkCDssm4QOtJQLmWfnBWz1dAaTCpX4VlSkDYihq8kBhYQBtAC+qDLVFAI3Llg0KVVkCo82j9llRQQNo1vHlFKk9Au5XLwaVXPUBkJiuDhedXQIOAUoLzI1dAyvJdAr7aSECGFZIlkDE3QAJgLf7jLz5A6BDFCDLLG0CCtXtBGC5OQEwINnxqbgtA3gX/+KcTPEBvcz8hzh5NQBGzf6Qu6wtAgHxa9xhQPUDrBbAZKxtHQLo9MrgDWFhAB3HnuOFCSEC9LB7uoGEwQF/yhHyaoUNArp+I4lInQkCVPgnrmyNQQF0/QzF8r0tA4A2JJwpeVkDs8ISefUQmQAPC8AQ9pytAGqqlibTXAUAgzse1FkdVQAp+g4ukkClAjdEjWhLBUUCsbY+Ph2g7QP+RD2oqDldAwhtSFj9pKUCvHG+E+nlKQDwEA4RekFJAvjj6LEM/WEDUwnk45wEjQN93fo1OykJAXk2lqcgUL0AWQfN17n4WQDLf9MNKlUJAj/5vqOoMUEDLbvhNGWVVQAB/iUKP00RAcVbEnU2+RUBGBt61KLxOQFbl85VRNlRA8WOGFGigMkCJGIFZ1dBQQG5/mdQXt1RA4NCCwXUJR0CP9HgcAR05QP5O5RX/Mi1AL5qh3aHaRkB3vFYSwt5LQOoR+AzuMj1A1rZ82BRHSkBnH79w0RNRQD7wYkLalFRAM5dM9YGERUCMugFQ0CdUQN+5o5qQqjlAlkZMN6CaV0AwB9McNOk4QHHzwOv5IzBABNjslXcc7D/Ejizoe4hXQIqi6TFkhENAgoX+byh+UED3QDrBqohMQCbvrhB0L1dAwOKJrgooUkCoWdbg80AqQHXi3Pza4z9AHCe3KnYWSkAmF+53djRBQJfguSIMiFRAsdWpAI2iUkCVW6ZTJRhJQKxx5n4P2UJAPsc0APvMOkBgXvrAmc0rQKTX6j8IljBAFN8DG9qDVEClQdUR2c1GQCv/F65gEVhAcSL2Qm4PUEDkU1T89jREQFGWrUSQCUlAQ/l4tB4tE0CZSJPx2vJCQJAOZcdorUZATljqrUP9VEBeQ4+xySo+QKLD5GOzY0VAtMucB6MdT0CvGt5RdVpWQLtDXgO32CNAknPl75YmWEBuj/4XBMQRQPGl91Tos1ZAWs913LJnSkAOHH/IWG01QA4rfV6X61hAP0Wv2vL1VkDtCBbl3PxDQAmC71RoKSZA8+Utlwu4UEBWhwq/qFYsQFjYcNDX2UZAzhyYetCqV0BExfEcGG5LQHRRqeeVBTlAPL58FCHcO0DioeTVYkJUQHzuKo3ZkUNAEX40v+jxUECTYBvI/etOQOKqbAbQe1ZABtTi9PpRVkBWTVqlm6s7QKwgGvgoblRATy6z+/76S0DMGWy68LsvQIVRBfLepkBArZemFQFbUkC+/iOfPhpSQAx73kQn5lBArsWy2V25NkATkjlwempRQOOl5+5/CFZAEQapS5x7V0DKl0FE7NtUQKWNdqWQMVhAMww2QJ9WUkCSYxYVF09CQOiM8Xm29lJAeoz5wLG9U0BWO3SKXL1IQGh3XGZrOFRAe5BfHnccP0DRsJGtuttKQFSVYqRU8VNADOf4vmxSRkAf4zWSjAdSQNaEjimnFFZA7fssnHmYOUBLFumebnAzQNLt5mkXFzBAWx9o2qPMP0DQ5J2QIY1JQBWol4UdCkhAzB7PFhj0IUBW0WfFFt0zQIE3lAIVBD9AeWONnxpGHUC10w3tm5U+QFJq7oZAcBVAto8DWIC9WEB4LVqxjL0QQBTkV/5czk9AjUaq0+LHQ0A90HAfEnBUQOBhy51+IjdA/RrFfvskNkDv7kJvisQrQMUO/ph5l1BAZQ1HWb0sV0Czox87aRpSQGzqZA8IfVBAL1+rmRSuVUBGSBBmpAJPQJvMQin6zgJAtjq/oVViV0CbGWbFPXxNQCWb89pFGUxAb66hut15SkC3Xq0vemBGQFOBjTuEdkdAnq6oE92ISkBS1XGeciUnQELOqcitsD5AZwSrpec5UUBDJBPOKVEjQCUJS4tZFFdA+35yBMOVSUC1j2vAcdQiQMZqKQgRvkZApZ3j4mM7VEDW49qUx4MfQOsLsg+ZaSNAes3hUpdSQ0Agj1VQjyhUQB+9DrwbQlFAB8jMn11LIUAIdUObuAsfQDyuIyAkMUJA1Kjpf/4zTkDrWw7cJ+AhQPQNPnMOF1ZAYNVgi4zxMUAAF03o6CxXQIn69E1BLzVARhg1RlGXSEBA5ZOii4RAQP+1mIQ8d1hADZtzIgfRT0AvFfnBca8yQLquvwf+mjdAvAhV80eGNkBS5h6+4T04QKghVJosIylAoSP/wFYeVkBTqrOZkKA8QOx5VB/f3zlA0ffDupeoUEB8tuP4kXVEQA4BhX4/ZkdA1kxI6UR1VUCyMjmKfFQyQOgZb7MxxD9An890gaEeRUDz/jxCCOExQM404GiyIE9ArfOt1JU7VkCup2Ch+CY+QKzVdqC3YVBAUAmUw10ZUUDiRdr9SFhRQA==\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[2000]}},\"selected\":{\"id\":\"2427\"},\"selection_policy\":{\"id\":\"2426\"}},\"id\":\"2312\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"#1f77b4\"},\"hatch_alpha\":{\"value\":0.2},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":null},\"radius\":{\"value\":1},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2315\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"2292\",\"type\":\"DataRange1d\"},{\"attributes\":{\"axis\":{\"id\":\"2302\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"2305\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"2299\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"2424\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"bottom_units\":\"screen\",\"coordinates\":null,\"fill_alpha\":0.5,\"fill_color\":\"lightgrey\",\"group\":null,\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":1.0,\"line_color\":\"black\",\"line_dash\":[4,4],\"line_width\":2,\"right_units\":\"screen\",\"syncable\":false,\"top_units\":\"screen\"},\"id\":\"2308\",\"type\":\"BoxAnnotation\"},{\"attributes\":{\"args\":{\"div\":{\"id\":\"2318\"}},\"code\":\"\\n div.text = \\\"Button!\\\";\\n \"},\"id\":\"2322\",\"type\":\"CustomJS\"},{\"attributes\":{\"below\":[{\"id\":\"2298\"}],\"center\":[{\"id\":\"2301\"},{\"id\":\"2305\"}],\"height\":400,\"js_event_callbacks\":{\"selectiongeometry\":[{\"id\":\"2323\"}]},\"left\":[{\"id\":\"2302\"}],\"renderers\":[{\"id\":\"2316\"}],\"title\":{\"id\":\"2418\"},\"toolbar\":{\"id\":\"2309\"},\"width\":800,\"x_range\":{\"id\":\"2290\"},\"x_scale\":{\"id\":\"2294\"},\"y_range\":{\"id\":\"2292\"},\"y_scale\":{\"id\":\"2296\"}},\"id\":\"2289\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"2296\",\"type\":\"LinearScale\"},{\"attributes\":{\"coordinates\":null,\"group\":null},\"id\":\"2418\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"2303\",\"type\":\"BasicTicker\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"2424\"},\"group\":null,\"major_label_policy\":{\"id\":\"2425\"},\"ticker\":{\"id\":\"2299\"}},\"id\":\"2298\",\"type\":\"LinearAxis\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"#1f77b4\"},\"hatch_alpha\":{\"value\":0.1},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":null},\"radius\":{\"value\":1},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2314\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"2294\",\"type\":\"LinearScale\"},{\"attributes\":{\"children\":[{\"id\":\"2289\"},{\"id\":\"2318\"}]},\"id\":\"2320\",\"type\":\"Row\"},{\"attributes\":{\"tools\":[{\"id\":\"2306\"},{\"id\":\"2307\"}]},\"id\":\"2309\",\"type\":\"Toolbar\"},{\"attributes\":{\"axis\":{\"id\":\"2298\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"2301\",\"type\":\"Grid\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"2421\"},\"group\":null,\"major_label_policy\":{\"id\":\"2422\"},\"ticker\":{\"id\":\"2303\"}},\"id\":\"2302\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"2421\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"2425\",\"type\":\"AllLabels\"},{\"attributes\":{\"args\":{\"div\":{\"id\":\"2318\"}},\"code\":\"\\n div.text = \\\"Selection! <p> <p>\\\" + JSON.stringify(cb_obj.geometry, undefined, 2);\\n \"},\"id\":\"2323\",\"type\":\"CustomJS\"},{\"attributes\":{},\"id\":\"2426\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"2312\"},\"glyph\":{\"id\":\"2313\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"2315\"},\"nonselection_glyph\":{\"id\":\"2314\"},\"view\":{\"id\":\"2317\"}},\"id\":\"2316\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"2422\",\"type\":\"AllLabels\"}],\"root_ids\":[\"2321\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n",
1229
+ " const render_items = [{\"docid\":\"a5664bf2-96c4-4385-9dee-f4f890edea9c\",\"root_ids\":[\"2321\"],\"roots\":{\"2321\":\"a240e231-c73a-4432-a8be-6d51807b2fa8\"}}];\n",
1230
+ " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
1231
+ " }\n",
1232
+ " if (root.Bokeh !== undefined) {\n",
1233
+ " embed_document(root);\n",
1234
+ " } else {\n",
1235
+ " let attempts = 0;\n",
1236
+ " const timer = setInterval(function(root) {\n",
1237
+ " if (root.Bokeh !== undefined) {\n",
1238
+ " clearInterval(timer);\n",
1239
+ " embed_document(root);\n",
1240
+ " } else {\n",
1241
+ " attempts++;\n",
1242
+ " if (attempts > 100) {\n",
1243
+ " clearInterval(timer);\n",
1244
+ " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
1245
+ " }\n",
1246
+ " }\n",
1247
+ " }, 10, root)\n",
1248
+ " }\n",
1249
+ "})(window);"
1250
+ ],
1251
+ "application/vnd.bokehjs_exec.v0+json": ""
1252
+ },
1253
+ "metadata": {
1254
+ "application/vnd.bokehjs_exec.v0+json": {
1255
+ "id": "2321"
1256
+ }
1257
+ },
1258
+ "output_type": "display_data"
1259
+ }
1260
+ ],
1261
+ "source": [
1262
+ "x = np.random.random(size=2000) * 100\n",
1263
+ "y = np.random.random(size=2000) * 100\n",
1264
+ "\n",
1265
+ "# create a new plot using figure\n",
1266
+ "p = figure(\n",
1267
+ " plot_height=400,\n",
1268
+ " plot_width=800,\n",
1269
+ " tools=\"box_select, reset\"\n",
1270
+ ")\n",
1271
+ "\n",
1272
+ "p.scatter(\n",
1273
+ " x,\n",
1274
+ " y,\n",
1275
+ " radius=1,\n",
1276
+ " fill_alpha=0.6,\n",
1277
+ " line_color=None\n",
1278
+ ")\n",
1279
+ "\n",
1280
+ "div = Div(width=400)\n",
1281
+ "button = Button(\n",
1282
+ " label=\"Button\",\n",
1283
+ " width=300\n",
1284
+ ")\n",
1285
+ "\n",
1286
+ "layout = column(\n",
1287
+ " button,\n",
1288
+ " row(p, div)\n",
1289
+ ")\n",
1290
+ "\n",
1291
+ "# Events with no attributes\n",
1292
+ "button.js_on_event(\n",
1293
+ " events.ButtonClick,\n",
1294
+ " CustomJS(\n",
1295
+ " args=dict(div=div),\n",
1296
+ " code=\"\"\"\n",
1297
+ " div.text = \"Button!\";\n",
1298
+ " \"\"\"\n",
1299
+ " )\n",
1300
+ ") \n",
1301
+ "\n",
1302
+ "p.js_on_event(\n",
1303
+ " events.SelectionGeometry,\n",
1304
+ " CustomJS(\n",
1305
+ " args=dict(div=div),\n",
1306
+ " code=\"\"\"\n",
1307
+ " div.text = \"Selection! <p> <p>\" + JSON.stringify(cb_obj.geometry, undefined, 2);\n",
1308
+ " \"\"\"\n",
1309
+ " )\n",
1310
+ ")\n",
1311
+ "\n",
1312
+ "show(layout)"
1313
+ ]
1314
+ },
1315
+ {
1316
+ "cell_type": "markdown",
1317
+ "metadata": {},
1318
+ "source": [
1319
+ "### Additional Information\n",
1320
+ "\n",
1321
+ "There are many kinds of interactions and events that can be connected to `CustomJS` callbacks. \n",
1322
+ "\n",
1323
+ "\n",
1324
+ "* Widgets - Button, Toggle, Dropdown, TextInput, AutocompleteInput, Select, Multiselect, Slider, (DateRangeSlider), DatePicker,\n",
1325
+ "* Tools - TapTool, BoxSelectTool, HoverTool,\n",
1326
+ "* Selection - ColumnDataSource, AjaxDataSource, BlazeDataSource, ServerDataSource\n",
1327
+ "* Ranges - Range1d, DataRange1d, FactorRange\n",
1328
+ "\n",
1329
+ "\n",
1330
+ "For more complete examples the User Guide section on [JavaScript Interactions](https://bokeh.pydata.org/en/latest/docs/user_guide/interaction.html)"
1331
+ ]
1332
+ }
1333
+ ],
1334
+ "metadata": {
1335
+ "anaconda-cloud": {},
1336
+ "kernelspec": {
1337
+ "display_name": "Python 3",
1338
+ "language": "python",
1339
+ "name": "python3"
1340
+ },
1341
+ "language_info": {
1342
+ "codemirror_mode": {
1343
+ "name": "ipython",
1344
+ "version": 3
1345
+ },
1346
+ "file_extension": ".py",
1347
+ "mimetype": "text/x-python",
1348
+ "name": "python",
1349
+ "nbconvert_exporter": "python",
1350
+ "pygments_lexer": "ipython3",
1351
+ "version": "3.7.9"
1352
+ }
1353
+ },
1354
+ "nbformat": 4,
1355
+ "nbformat_minor": 4
1356
+ }