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,1196 @@
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "<table style=\"float:left; border:none\">\n",
8
+ " <tr style=\"border:none\">\n",
9
+ " <td style=\"border:none\">\n",
10
+ " <a href=\"https://bokeh.org/\"> \n",
11
+ " <img \n",
12
+ " src=\"assets/bokeh-transparent.png\" \n",
13
+ " style=\"width:50px\"\n",
14
+ " >\n",
15
+ " </a> \n",
16
+ " </td>\n",
17
+ " <td style=\"border:none\">\n",
18
+ " <h1>Bokeh Tutorial</h1>\n",
19
+ " </td>\n",
20
+ " </tr>\n",
21
+ "</table>\n",
22
+ "\n",
23
+ "<div style=\"float:right;\"><h2>06. Linking and Interactions</h2></div>"
24
+ ]
25
+ },
26
+ {
27
+ "cell_type": "code",
28
+ "execution_count": 1,
29
+ "metadata": {},
30
+ "outputs": [
31
+ {
32
+ "data": {
33
+ "text/html": [
34
+ "<div class=\"bk-root\">\n",
35
+ " <a href=\"https://bokeh.org\" target=\"_blank\" class=\"bk-logo bk-logo-small bk-logo-notebook\"></a>\n",
36
+ " <span id=\"1002\">Loading BokehJS ...</span>\n",
37
+ " </div>\n"
38
+ ]
39
+ },
40
+ "metadata": {},
41
+ "output_type": "display_data"
42
+ },
43
+ {
44
+ "data": {
45
+ "application/javascript": [
46
+ "(function(root) {\n",
47
+ " function now() {\n",
48
+ " return new Date();\n",
49
+ " }\n",
50
+ "\n",
51
+ " const force = true;\n",
52
+ "\n",
53
+ " if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n",
54
+ " root._bokeh_onload_callbacks = [];\n",
55
+ " root._bokeh_is_loading = undefined;\n",
56
+ " }\n",
57
+ "\n",
58
+ "const JS_MIME_TYPE = 'application/javascript';\n",
59
+ " const HTML_MIME_TYPE = 'text/html';\n",
60
+ " const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n",
61
+ " const CLASS_NAME = 'output_bokeh rendered_html';\n",
62
+ "\n",
63
+ " /**\n",
64
+ " * Render data to the DOM node\n",
65
+ " */\n",
66
+ " function render(props, node) {\n",
67
+ " const script = document.createElement(\"script\");\n",
68
+ " node.appendChild(script);\n",
69
+ " }\n",
70
+ "\n",
71
+ " /**\n",
72
+ " * Handle when an output is cleared or removed\n",
73
+ " */\n",
74
+ " function handleClearOutput(event, handle) {\n",
75
+ " const cell = handle.cell;\n",
76
+ "\n",
77
+ " const id = cell.output_area._bokeh_element_id;\n",
78
+ " const server_id = cell.output_area._bokeh_server_id;\n",
79
+ " // Clean up Bokeh references\n",
80
+ " if (id != null && id in Bokeh.index) {\n",
81
+ " Bokeh.index[id].model.document.clear();\n",
82
+ " delete Bokeh.index[id];\n",
83
+ " }\n",
84
+ "\n",
85
+ " if (server_id !== undefined) {\n",
86
+ " // Clean up Bokeh references\n",
87
+ " const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n",
88
+ " cell.notebook.kernel.execute(cmd_clean, {\n",
89
+ " iopub: {\n",
90
+ " output: function(msg) {\n",
91
+ " const id = msg.content.text.trim();\n",
92
+ " if (id in Bokeh.index) {\n",
93
+ " Bokeh.index[id].model.document.clear();\n",
94
+ " delete Bokeh.index[id];\n",
95
+ " }\n",
96
+ " }\n",
97
+ " }\n",
98
+ " });\n",
99
+ " // Destroy server and session\n",
100
+ " const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n",
101
+ " cell.notebook.kernel.execute(cmd_destroy);\n",
102
+ " }\n",
103
+ " }\n",
104
+ "\n",
105
+ " /**\n",
106
+ " * Handle when a new output is added\n",
107
+ " */\n",
108
+ " function handleAddOutput(event, handle) {\n",
109
+ " const output_area = handle.output_area;\n",
110
+ " const output = handle.output;\n",
111
+ "\n",
112
+ " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n",
113
+ " if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n",
114
+ " return\n",
115
+ " }\n",
116
+ "\n",
117
+ " const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n",
118
+ "\n",
119
+ " if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n",
120
+ " toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n",
121
+ " // store reference to embed id on output_area\n",
122
+ " output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n",
123
+ " }\n",
124
+ " if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n",
125
+ " const bk_div = document.createElement(\"div\");\n",
126
+ " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n",
127
+ " const script_attrs = bk_div.children[0].attributes;\n",
128
+ " for (let i = 0; i < script_attrs.length; i++) {\n",
129
+ " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n",
130
+ " toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n",
131
+ " }\n",
132
+ " // store reference to server id on output_area\n",
133
+ " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n",
134
+ " }\n",
135
+ " }\n",
136
+ "\n",
137
+ " function register_renderer(events, OutputArea) {\n",
138
+ "\n",
139
+ " function append_mime(data, metadata, element) {\n",
140
+ " // create a DOM node to render to\n",
141
+ " const toinsert = this.create_output_subarea(\n",
142
+ " metadata,\n",
143
+ " CLASS_NAME,\n",
144
+ " EXEC_MIME_TYPE\n",
145
+ " );\n",
146
+ " this.keyboard_manager.register_events(toinsert);\n",
147
+ " // Render to node\n",
148
+ " const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n",
149
+ " render(props, toinsert[toinsert.length - 1]);\n",
150
+ " element.append(toinsert);\n",
151
+ " return toinsert\n",
152
+ " }\n",
153
+ "\n",
154
+ " /* Handle when an output is cleared or removed */\n",
155
+ " events.on('clear_output.CodeCell', handleClearOutput);\n",
156
+ " events.on('delete.Cell', handleClearOutput);\n",
157
+ "\n",
158
+ " /* Handle when a new output is added */\n",
159
+ " events.on('output_added.OutputArea', handleAddOutput);\n",
160
+ "\n",
161
+ " /**\n",
162
+ " * Register the mime type and append_mime function with output_area\n",
163
+ " */\n",
164
+ " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n",
165
+ " /* Is output safe? */\n",
166
+ " safe: true,\n",
167
+ " /* Index of renderer in `output_area.display_order` */\n",
168
+ " index: 0\n",
169
+ " });\n",
170
+ " }\n",
171
+ "\n",
172
+ " // register the mime type if in Jupyter Notebook environment and previously unregistered\n",
173
+ " if (root.Jupyter !== undefined) {\n",
174
+ " const events = require('base/js/events');\n",
175
+ " const OutputArea = require('notebook/js/outputarea').OutputArea;\n",
176
+ "\n",
177
+ " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n",
178
+ " register_renderer(events, OutputArea);\n",
179
+ " }\n",
180
+ " }\n",
181
+ " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n",
182
+ " root._bokeh_timeout = Date.now() + 5000;\n",
183
+ " root._bokeh_failed_load = false;\n",
184
+ " }\n",
185
+ "\n",
186
+ " const NB_LOAD_WARNING = {'data': {'text/html':\n",
187
+ " \"<div style='background-color: #fdd'>\\n\"+\n",
188
+ " \"<p>\\n\"+\n",
189
+ " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n",
190
+ " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n",
191
+ " \"</p>\\n\"+\n",
192
+ " \"<ul>\\n\"+\n",
193
+ " \"<li>re-rerun `output_notebook()` to attempt to load from CDN again, or</li>\\n\"+\n",
194
+ " \"<li>use INLINE resources instead, as so:</li>\\n\"+\n",
195
+ " \"</ul>\\n\"+\n",
196
+ " \"<code>\\n\"+\n",
197
+ " \"from bokeh.resources import INLINE\\n\"+\n",
198
+ " \"output_notebook(resources=INLINE)\\n\"+\n",
199
+ " \"</code>\\n\"+\n",
200
+ " \"</div>\"}};\n",
201
+ "\n",
202
+ " function display_loaded() {\n",
203
+ " const el = document.getElementById(\"1002\");\n",
204
+ " if (el != null) {\n",
205
+ " el.textContent = \"BokehJS is loading...\";\n",
206
+ " }\n",
207
+ " if (root.Bokeh !== undefined) {\n",
208
+ " if (el != null) {\n",
209
+ " el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n",
210
+ " }\n",
211
+ " } else if (Date.now() < root._bokeh_timeout) {\n",
212
+ " setTimeout(display_loaded, 100)\n",
213
+ " }\n",
214
+ " }\n",
215
+ "\n",
216
+ " function run_callbacks() {\n",
217
+ " try {\n",
218
+ " root._bokeh_onload_callbacks.forEach(function(callback) {\n",
219
+ " if (callback != null)\n",
220
+ " callback();\n",
221
+ " });\n",
222
+ " } finally {\n",
223
+ " delete root._bokeh_onload_callbacks\n",
224
+ " }\n",
225
+ " console.debug(\"Bokeh: all callbacks have finished\");\n",
226
+ " }\n",
227
+ "\n",
228
+ " function load_libs(css_urls, js_urls, callback) {\n",
229
+ " if (css_urls == null) css_urls = [];\n",
230
+ " if (js_urls == null) js_urls = [];\n",
231
+ "\n",
232
+ " root._bokeh_onload_callbacks.push(callback);\n",
233
+ " if (root._bokeh_is_loading > 0) {\n",
234
+ " console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n",
235
+ " return null;\n",
236
+ " }\n",
237
+ " if (js_urls == null || js_urls.length === 0) {\n",
238
+ " run_callbacks();\n",
239
+ " return null;\n",
240
+ " }\n",
241
+ " console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n",
242
+ " root._bokeh_is_loading = css_urls.length + js_urls.length;\n",
243
+ "\n",
244
+ " function on_load() {\n",
245
+ " root._bokeh_is_loading--;\n",
246
+ " if (root._bokeh_is_loading === 0) {\n",
247
+ " console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n",
248
+ " run_callbacks()\n",
249
+ " }\n",
250
+ " }\n",
251
+ "\n",
252
+ " function on_error(url) {\n",
253
+ " console.error(\"failed to load \" + url);\n",
254
+ " }\n",
255
+ "\n",
256
+ " for (let i = 0; i < css_urls.length; i++) {\n",
257
+ " const url = css_urls[i];\n",
258
+ " const element = document.createElement(\"link\");\n",
259
+ " element.onload = on_load;\n",
260
+ " element.onerror = on_error.bind(null, url);\n",
261
+ " element.rel = \"stylesheet\";\n",
262
+ " element.type = \"text/css\";\n",
263
+ " element.href = url;\n",
264
+ " console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n",
265
+ " document.body.appendChild(element);\n",
266
+ " }\n",
267
+ "\n",
268
+ " for (let i = 0; i < js_urls.length; i++) {\n",
269
+ " const url = js_urls[i];\n",
270
+ " const element = document.createElement('script');\n",
271
+ " element.onload = on_load;\n",
272
+ " element.onerror = on_error.bind(null, url);\n",
273
+ " element.async = false;\n",
274
+ " element.src = url;\n",
275
+ " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n",
276
+ " document.head.appendChild(element);\n",
277
+ " }\n",
278
+ " };\n",
279
+ "\n",
280
+ " function inject_raw_css(css) {\n",
281
+ " const element = document.createElement(\"style\");\n",
282
+ " element.appendChild(document.createTextNode(css));\n",
283
+ " document.body.appendChild(element);\n",
284
+ " }\n",
285
+ "\n",
286
+ " 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",
287
+ " const css_urls = [];\n",
288
+ "\n",
289
+ " const inline_js = [ function(Bokeh) {\n",
290
+ " Bokeh.set_log_level(\"info\");\n",
291
+ " },\n",
292
+ "function(Bokeh) {\n",
293
+ " }\n",
294
+ " ];\n",
295
+ "\n",
296
+ " function run_inline_js() {\n",
297
+ " if (root.Bokeh !== undefined || force === true) {\n",
298
+ " for (let i = 0; i < inline_js.length; i++) {\n",
299
+ " inline_js[i].call(root, root.Bokeh);\n",
300
+ " }\n",
301
+ "if (force === true) {\n",
302
+ " display_loaded();\n",
303
+ " }} else if (Date.now() < root._bokeh_timeout) {\n",
304
+ " setTimeout(run_inline_js, 100);\n",
305
+ " } else if (!root._bokeh_failed_load) {\n",
306
+ " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n",
307
+ " root._bokeh_failed_load = true;\n",
308
+ " } else if (force !== true) {\n",
309
+ " const cell = $(document.getElementById(\"1002\")).parents('.cell').data().cell;\n",
310
+ " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n",
311
+ " }\n",
312
+ " }\n",
313
+ "\n",
314
+ " if (root._bokeh_is_loading === 0) {\n",
315
+ " console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n",
316
+ " run_inline_js();\n",
317
+ " } else {\n",
318
+ " load_libs(css_urls, js_urls, function() {\n",
319
+ " console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n",
320
+ " run_inline_js();\n",
321
+ " });\n",
322
+ " }\n",
323
+ "}(window));"
324
+ ],
325
+ "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));"
326
+ },
327
+ "metadata": {},
328
+ "output_type": "display_data"
329
+ }
330
+ ],
331
+ "source": [
332
+ "from bokeh.io import output_notebook, show\n",
333
+ "from bokeh.plotting import figure\n",
334
+ "output_notebook()"
335
+ ]
336
+ },
337
+ {
338
+ "cell_type": "markdown",
339
+ "metadata": {},
340
+ "source": [
341
+ "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. "
342
+ ]
343
+ },
344
+ {
345
+ "cell_type": "markdown",
346
+ "metadata": {},
347
+ "source": [
348
+ "# Linked Interactions\n",
349
+ "\n",
350
+ "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. "
351
+ ]
352
+ },
353
+ {
354
+ "cell_type": "markdown",
355
+ "metadata": {},
356
+ "source": [
357
+ "## Linked panning\n",
358
+ "\n",
359
+ "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:"
360
+ ]
361
+ },
362
+ {
363
+ "cell_type": "code",
364
+ "execution_count": 2,
365
+ "metadata": {},
366
+ "outputs": [
367
+ {
368
+ "data": {
369
+ "text/html": [
370
+ "\n",
371
+ " <div class=\"bk-root\" id=\"6312c82d-622a-4003-a670-7a4dfa59122b\" data-root-id=\"1120\"></div>\n"
372
+ ]
373
+ },
374
+ "metadata": {},
375
+ "output_type": "display_data"
376
+ },
377
+ {
378
+ "data": {
379
+ "application/javascript": [
380
+ "(function(root) {\n",
381
+ " function embed_document(root) {\n",
382
+ " const docs_json = {\"7cf73955-85b5-4a62-8b3f-0073a2f66e1f\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"children\":[{\"id\":\"1119\"},{\"id\":\"1117\"}]},\"id\":\"1120\",\"type\":\"Column\"},{\"attributes\":{},\"id\":\"1020\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"1039\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1021\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"axis\":{\"id\":\"1038\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1041\",\"type\":\"Grid\"},{\"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\":\"1028\",\"type\":\"Circle\"},{\"attributes\":{\"tools\":[{\"id\":\"1020\"},{\"id\":\"1021\"}]},\"id\":\"1022\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"1043\",\"type\":\"BasicTicker\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1101\"},\"group\":null,\"major_label_policy\":{\"id\":\"1102\"},\"ticker\":{\"id\":\"1039\"}},\"id\":\"1038\",\"type\":\"LinearAxis\"},{\"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\":\"1027\",\"type\":\"Circle\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1098\"},\"group\":null,\"major_label_policy\":{\"id\":\"1099\"},\"ticker\":{\"id\":\"1043\"}},\"id\":\"1042\",\"type\":\"LinearAxis\"},{\"attributes\":{\"below\":[{\"id\":\"1012\"}],\"center\":[{\"id\":\"1015\"},{\"id\":\"1019\"}],\"height\":250,\"left\":[{\"id\":\"1016\"}],\"renderers\":[{\"id\":\"1029\"}],\"title\":{\"id\":\"1084\"},\"toolbar\":{\"id\":\"1022\"},\"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\":{\"axis\":{\"id\":\"1042\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1045\",\"type\":\"Grid\"},{\"attributes\":{\"source\":{\"id\":\"1025\"}},\"id\":\"1030\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1046\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"1047\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1051\"},\"glyph\":{\"id\":\"1052\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1054\"},\"nonselection_glyph\":{\"id\":\"1053\"},\"view\":{\"id\":\"1056\"}},\"id\":\"1055\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1006\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1004\",\"type\":\"DataRange1d\"},{\"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\":\"1093\"},\"selection_policy\":{\"id\":\"1092\"}},\"id\":\"1025\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1087\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"tools\":[{\"id\":\"1046\"},{\"id\":\"1047\"}]},\"id\":\"1048\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"1088\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1059\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1013\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1008\",\"type\":\"LinearScale\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1025\"},\"glyph\":{\"id\":\"1026\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1028\"},\"nonselection_glyph\":{\"id\":\"1027\"},\"view\":{\"id\":\"1030\"}},\"id\":\"1029\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"source\":{\"id\":\"1051\"}},\"id\":\"1056\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1010\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1034\",\"type\":\"LinearScale\"},{\"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\":\"1054\",\"type\":\"Scatter\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1090\"},\"group\":null,\"major_label_policy\":{\"id\":\"1091\"},\"ticker\":{\"id\":\"1013\"}},\"id\":\"1012\",\"type\":\"LinearAxis\"},{\"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\":\"1053\",\"type\":\"Scatter\"},{\"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\":\"1115\"},\"selection_policy\":{\"id\":\"1114\"}},\"id\":\"1078\",\"type\":\"ColumnDataSource\"},{\"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\":\"1104\"},\"selection_policy\":{\"id\":\"1103\"}},\"id\":\"1051\",\"type\":\"ColumnDataSource\"},{\"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\":\"1052\",\"type\":\"Scatter\"},{\"attributes\":{\"children\":[[{\"id\":\"1003\"},0,0],[{\"id\":\"1031\"},0,1],[{\"id\":\"1057\"},0,2]]},\"id\":\"1117\",\"type\":\"GridBox\"},{\"attributes\":{\"axis\":{\"id\":\"1012\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1015\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1036\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1017\",\"type\":\"BasicTicker\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1087\"},\"group\":null,\"major_label_policy\":{\"id\":\"1088\"},\"ticker\":{\"id\":\"1017\"}},\"id\":\"1016\",\"type\":\"LinearAxis\"},{\"attributes\":{\"fill_color\":{\"value\":\"navy\"},\"hatch_color\":{\"value\":\"navy\"},\"line_color\":{\"value\":\"navy\"},\"size\":{\"value\":10},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1026\",\"type\":\"Circle\"},{\"attributes\":{\"axis\":{\"id\":\"1016\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1019\",\"type\":\"Grid\"},{\"attributes\":{\"below\":[{\"id\":\"1038\"}],\"center\":[{\"id\":\"1041\"},{\"id\":\"1045\"}],\"height\":250,\"left\":[{\"id\":\"1042\"}],\"renderers\":[{\"id\":\"1055\"}],\"title\":{\"id\":\"1095\"},\"toolbar\":{\"id\":\"1048\"},\"toolbar_location\":null,\"width\":250,\"x_range\":{\"id\":\"1004\"},\"x_scale\":{\"id\":\"1034\"},\"y_range\":{\"id\":\"1006\"},\"y_scale\":{\"id\":\"1036\"}},\"id\":\"1031\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"1066\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1104\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1103\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1109\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1061\",\"type\":\"LinearScale\"},{\"attributes\":{\"below\":[{\"id\":\"1065\"}],\"center\":[{\"id\":\"1068\"},{\"id\":\"1072\"}],\"height\":250,\"left\":[{\"id\":\"1069\"}],\"renderers\":[{\"id\":\"1082\"}],\"title\":{\"id\":\"1106\"},\"toolbar\":{\"id\":\"1075\"},\"toolbar_location\":null,\"width\":250,\"x_range\":{\"id\":\"1004\"},\"x_scale\":{\"id\":\"1061\"},\"y_range\":{\"id\":\"1059\"},\"y_scale\":{\"id\":\"1063\"}},\"id\":\"1057\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"1112\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1063\",\"type\":\"LinearScale\"},{\"attributes\":{\"coordinates\":null,\"group\":null},\"id\":\"1106\",\"type\":\"Title\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1112\"},\"group\":null,\"major_label_policy\":{\"id\":\"1113\"},\"ticker\":{\"id\":\"1066\"}},\"id\":\"1065\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1113\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1110\",\"type\":\"AllLabels\"},{\"attributes\":{\"axis\":{\"id\":\"1065\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1068\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1114\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1070\",\"type\":\"BasicTicker\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1109\"},\"group\":null,\"major_label_policy\":{\"id\":\"1110\"},\"ticker\":{\"id\":\"1070\"}},\"id\":\"1069\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1115\",\"type\":\"Selection\"},{\"attributes\":{\"toolbars\":[{\"id\":\"1022\"},{\"id\":\"1048\"},{\"id\":\"1075\"}],\"tools\":[{\"id\":\"1020\"},{\"id\":\"1021\"},{\"id\":\"1046\"},{\"id\":\"1047\"},{\"id\":\"1073\"},{\"id\":\"1074\"}]},\"id\":\"1118\",\"type\":\"ProxyToolbar\"},{\"attributes\":{\"toolbar\":{\"id\":\"1118\"},\"toolbar_location\":\"above\"},\"id\":\"1119\",\"type\":\"ToolbarBox\"},{\"attributes\":{\"axis\":{\"id\":\"1069\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1072\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1073\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"1091\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1074\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"coordinates\":null,\"group\":null},\"id\":\"1095\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1093\",\"type\":\"Selection\"},{\"attributes\":{\"tools\":[{\"id\":\"1073\"},{\"id\":\"1074\"}]},\"id\":\"1075\",\"type\":\"Toolbar\"},{\"attributes\":{\"source\":{\"id\":\"1078\"}},\"id\":\"1083\",\"type\":\"CDSView\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1078\"},\"glyph\":{\"id\":\"1079\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1081\"},\"nonselection_glyph\":{\"id\":\"1080\"},\"view\":{\"id\":\"1083\"}},\"id\":\"1082\",\"type\":\"GlyphRenderer\"},{\"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\":\"1081\",\"type\":\"Scatter\"},{\"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\":\"1080\",\"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\":\"1079\",\"type\":\"Scatter\"},{\"attributes\":{},\"id\":\"1092\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"coordinates\":null,\"group\":null},\"id\":\"1084\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1098\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1090\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1101\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1099\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1102\",\"type\":\"AllLabels\"}],\"root_ids\":[\"1120\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n",
383
+ " const render_items = [{\"docid\":\"7cf73955-85b5-4a62-8b3f-0073a2f66e1f\",\"root_ids\":[\"1120\"],\"roots\":{\"1120\":\"6312c82d-622a-4003-a670-7a4dfa59122b\"}}];\n",
384
+ " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
385
+ " }\n",
386
+ " if (root.Bokeh !== undefined) {\n",
387
+ " embed_document(root);\n",
388
+ " } else {\n",
389
+ " let attempts = 0;\n",
390
+ " const timer = setInterval(function(root) {\n",
391
+ " if (root.Bokeh !== undefined) {\n",
392
+ " clearInterval(timer);\n",
393
+ " embed_document(root);\n",
394
+ " } else {\n",
395
+ " attempts++;\n",
396
+ " if (attempts > 100) {\n",
397
+ " clearInterval(timer);\n",
398
+ " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
399
+ " }\n",
400
+ " }\n",
401
+ " }, 10, root)\n",
402
+ " }\n",
403
+ "})(window);"
404
+ ],
405
+ "application/vnd.bokehjs_exec.v0+json": ""
406
+ },
407
+ "metadata": {
408
+ "application/vnd.bokehjs_exec.v0+json": {
409
+ "id": "1120"
410
+ }
411
+ },
412
+ "output_type": "display_data"
413
+ }
414
+ ],
415
+ "source": [
416
+ "from bokeh.layouts import gridplot\n",
417
+ "\n",
418
+ "x = list(range(11))\n",
419
+ "y0, y1, y2 = x, [10-i for i in x], [abs(i-5) for i in x]\n",
420
+ "\n",
421
+ "plot_options = dict(width=250, plot_height=250, tools='pan,wheel_zoom')\n",
422
+ "\n",
423
+ "# create a new plot\n",
424
+ "s1 = figure(**plot_options)\n",
425
+ "s1.circle(x, y0, size=10, color=\"navy\")\n",
426
+ "\n",
427
+ "# create a new plot and share both ranges\n",
428
+ "s2 = figure(x_range=s1.x_range, y_range=s1.y_range, **plot_options)\n",
429
+ "s2.triangle(x, y1, size=10, color=\"firebrick\")\n",
430
+ "\n",
431
+ "# create a new plot and share only one range\n",
432
+ "s3 = figure(x_range=s1.x_range, **plot_options)\n",
433
+ "s3.square(x, y2, size=10, color=\"olive\")\n",
434
+ "\n",
435
+ "p = gridplot([[s1, s2, s3]])\n",
436
+ "\n",
437
+ "# show the results\n",
438
+ "show(p)"
439
+ ]
440
+ },
441
+ {
442
+ "cell_type": "code",
443
+ "execution_count": 3,
444
+ "metadata": {},
445
+ "outputs": [],
446
+ "source": [
447
+ "# EXERCISE: create two plots in a gridplot, and link their ranges\n"
448
+ ]
449
+ },
450
+ {
451
+ "cell_type": "markdown",
452
+ "metadata": {},
453
+ "source": [
454
+ "## Linked brushing\n",
455
+ "\n",
456
+ "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:"
457
+ ]
458
+ },
459
+ {
460
+ "cell_type": "code",
461
+ "execution_count": 4,
462
+ "metadata": {},
463
+ "outputs": [
464
+ {
465
+ "data": {
466
+ "text/html": [
467
+ "\n",
468
+ " <div class=\"bk-root\" id=\"6059c111-fc48-49d4-b96e-dff139b1ddda\" data-root-id=\"1395\"></div>\n"
469
+ ]
470
+ },
471
+ "metadata": {},
472
+ "output_type": "display_data"
473
+ },
474
+ {
475
+ "data": {
476
+ "application/javascript": [
477
+ "(function(root) {\n",
478
+ " function embed_document(root) {\n",
479
+ " const docs_json = {\"989d0f00-b196-45c7-8bce-2926ca759832\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"children\":[{\"id\":\"1394\"},{\"id\":\"1392\"}]},\"id\":\"1395\",\"type\":\"Column\"},{\"attributes\":{\"children\":[[{\"id\":\"1302\"},0,0],[{\"id\":\"1334\"},0,1]]},\"id\":\"1392\",\"type\":\"GridBox\"},{\"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\":\"1375\"},\"selection_policy\":{\"id\":\"1374\"}},\"id\":\"1301\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1305\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1373\",\"type\":\"AllLabels\"},{\"attributes\":{\"tools\":[{\"id\":\"1319\"},{\"id\":\"1320\"},{\"id\":\"1321\"}]},\"id\":\"1324\",\"type\":\"Toolbar\"},{\"attributes\":{\"tools\":[{\"id\":\"1351\"},{\"id\":\"1352\"},{\"id\":\"1353\"}]},\"id\":\"1356\",\"type\":\"Toolbar\"},{\"attributes\":{\"axis\":{\"id\":\"1343\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1346\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1344\",\"type\":\"BasicTicker\"},{\"attributes\":{\"overlay\":{\"id\":\"1322\"}},\"id\":\"1319\",\"type\":\"BoxSelectTool\"},{\"attributes\":{\"fill_color\":{\"value\":\"#1f77b4\"},\"line_color\":{\"value\":\"#1f77b4\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y0\"}},\"id\":\"1329\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1374\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"below\":[{\"id\":\"1311\"}],\"center\":[{\"id\":\"1314\"},{\"id\":\"1318\"}],\"height\":300,\"left\":[{\"id\":\"1315\"}],\"renderers\":[{\"id\":\"1332\"}],\"title\":{\"id\":\"1366\"},\"toolbar\":{\"id\":\"1324\"},\"toolbar_location\":null,\"width\":300,\"x_range\":{\"id\":\"1303\"},\"x_scale\":{\"id\":\"1307\"},\"y_range\":{\"id\":\"1305\"},\"y_scale\":{\"id\":\"1309\"}},\"id\":\"1302\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"overlay\":{\"id\":\"1323\"}},\"id\":\"1320\",\"type\":\"LassoSelectTool\"},{\"attributes\":{},\"id\":\"1383\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1375\",\"type\":\"Selection\"},{\"attributes\":{\"toolbars\":[{\"id\":\"1324\"},{\"id\":\"1356\"}],\"tools\":[{\"id\":\"1319\"},{\"id\":\"1320\"},{\"id\":\"1321\"},{\"id\":\"1351\"},{\"id\":\"1352\"},{\"id\":\"1353\"}]},\"id\":\"1393\",\"type\":\"ProxyToolbar\"},{\"attributes\":{\"toolbar\":{\"id\":\"1393\"},\"toolbar_location\":\"above\"},\"id\":\"1394\",\"type\":\"ToolbarBox\"},{\"attributes\":{},\"id\":\"1321\",\"type\":\"HelpTool\"},{\"attributes\":{\"source\":{\"id\":\"1301\"}},\"id\":\"1333\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1382\",\"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\":\"1322\",\"type\":\"BoxAnnotation\"},{\"attributes\":{},\"id\":\"1303\",\"type\":\"DataRange1d\"},{\"attributes\":{\"source\":{\"id\":\"1301\"}},\"id\":\"1365\",\"type\":\"CDSView\"},{\"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\":\"1330\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1312\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1348\",\"type\":\"BasicTicker\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1382\"},\"group\":null,\"major_label_policy\":{\"id\":\"1383\"},\"ticker\":{\"id\":\"1348\"}},\"id\":\"1347\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1307\",\"type\":\"LinearScale\"},{\"attributes\":{\"coordinates\":null,\"group\":null},\"id\":\"1366\",\"type\":\"Title\"},{\"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\":\"1331\",\"type\":\"Circle\"},{\"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\":\"1323\",\"type\":\"PolyAnnotation\"},{\"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\":\"1363\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1309\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1335\",\"type\":\"DataRange1d\"},{\"attributes\":{\"fill_color\":{\"value\":\"#1f77b4\"},\"line_color\":{\"value\":\"#1f77b4\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y1\"}},\"id\":\"1361\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1370\",\"type\":\"AllLabels\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1372\"},\"group\":null,\"major_label_policy\":{\"id\":\"1373\"},\"ticker\":{\"id\":\"1312\"}},\"id\":\"1311\",\"type\":\"LinearAxis\"},{\"attributes\":{\"axis\":{\"id\":\"1347\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1350\",\"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\":\"1362\",\"type\":\"Circle\"},{\"attributes\":{\"axis\":{\"id\":\"1311\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1314\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1337\",\"type\":\"DataRange1d\"},{\"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\":\"1355\",\"type\":\"PolyAnnotation\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1301\"},\"glyph\":{\"id\":\"1329\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1331\"},\"nonselection_glyph\":{\"id\":\"1330\"},\"view\":{\"id\":\"1333\"}},\"id\":\"1332\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1341\",\"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\":\"1354\",\"type\":\"BoxAnnotation\"},{\"attributes\":{},\"id\":\"1316\",\"type\":\"BasicTicker\"},{\"attributes\":{\"overlay\":{\"id\":\"1354\"}},\"id\":\"1351\",\"type\":\"BoxSelectTool\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1369\"},\"group\":null,\"major_label_policy\":{\"id\":\"1370\"},\"ticker\":{\"id\":\"1316\"}},\"id\":\"1315\",\"type\":\"LinearAxis\"},{\"attributes\":{\"coordinates\":null,\"group\":null},\"id\":\"1379\",\"type\":\"Title\"},{\"attributes\":{\"overlay\":{\"id\":\"1355\"}},\"id\":\"1352\",\"type\":\"LassoSelectTool\"},{\"attributes\":{},\"id\":\"1339\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1369\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1385\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1353\",\"type\":\"HelpTool\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1301\"},\"glyph\":{\"id\":\"1361\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1363\"},\"nonselection_glyph\":{\"id\":\"1362\"},\"view\":{\"id\":\"1365\"}},\"id\":\"1364\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1385\"},\"group\":null,\"major_label_policy\":{\"id\":\"1386\"},\"ticker\":{\"id\":\"1344\"}},\"id\":\"1343\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1372\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1386\",\"type\":\"AllLabels\"},{\"attributes\":{\"axis\":{\"id\":\"1315\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1318\",\"type\":\"Grid\"},{\"attributes\":{\"below\":[{\"id\":\"1343\"}],\"center\":[{\"id\":\"1346\"},{\"id\":\"1350\"}],\"height\":300,\"left\":[{\"id\":\"1347\"}],\"renderers\":[{\"id\":\"1364\"}],\"title\":{\"id\":\"1379\"},\"toolbar\":{\"id\":\"1356\"},\"toolbar_location\":null,\"width\":300,\"x_range\":{\"id\":\"1335\"},\"x_scale\":{\"id\":\"1339\"},\"y_range\":{\"id\":\"1337\"},\"y_scale\":{\"id\":\"1341\"}},\"id\":\"1334\",\"subtype\":\"Figure\",\"type\":\"Plot\"}],\"root_ids\":[\"1395\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n",
480
+ " const render_items = [{\"docid\":\"989d0f00-b196-45c7-8bce-2926ca759832\",\"root_ids\":[\"1395\"],\"roots\":{\"1395\":\"6059c111-fc48-49d4-b96e-dff139b1ddda\"}}];\n",
481
+ " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
482
+ " }\n",
483
+ " if (root.Bokeh !== undefined) {\n",
484
+ " embed_document(root);\n",
485
+ " } else {\n",
486
+ " let attempts = 0;\n",
487
+ " const timer = setInterval(function(root) {\n",
488
+ " if (root.Bokeh !== undefined) {\n",
489
+ " clearInterval(timer);\n",
490
+ " embed_document(root);\n",
491
+ " } else {\n",
492
+ " attempts++;\n",
493
+ " if (attempts > 100) {\n",
494
+ " clearInterval(timer);\n",
495
+ " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
496
+ " }\n",
497
+ " }\n",
498
+ " }, 10, root)\n",
499
+ " }\n",
500
+ "})(window);"
501
+ ],
502
+ "application/vnd.bokehjs_exec.v0+json": ""
503
+ },
504
+ "metadata": {
505
+ "application/vnd.bokehjs_exec.v0+json": {
506
+ "id": "1395"
507
+ }
508
+ },
509
+ "output_type": "display_data"
510
+ }
511
+ ],
512
+ "source": [
513
+ "from bokeh.models import ColumnDataSource\n",
514
+ "\n",
515
+ "x = list(range(-20, 21))\n",
516
+ "y0, y1 = [abs(xx) for xx in x], [xx**2 for xx in x]\n",
517
+ "\n",
518
+ "# create a column data source for the plots to share\n",
519
+ "source = ColumnDataSource(data=dict(x=x, y0=y0, y1=y1))\n",
520
+ "\n",
521
+ "TOOLS = \"box_select,lasso_select,help\"\n",
522
+ "\n",
523
+ "# create a new plot and add a renderer\n",
524
+ "left = figure(tools=TOOLS, width=300, height=300)\n",
525
+ "left.circle('x', 'y0', source=source)\n",
526
+ "\n",
527
+ "# create another new plot and add a renderer\n",
528
+ "right = figure(tools=TOOLS, width=300, height=300)\n",
529
+ "right.circle('x', 'y1', source=source)\n",
530
+ "\n",
531
+ "p = gridplot([[left, right]])\n",
532
+ "\n",
533
+ "show(p)"
534
+ ]
535
+ },
536
+ {
537
+ "cell_type": "code",
538
+ "execution_count": 5,
539
+ "metadata": {},
540
+ "outputs": [],
541
+ "source": [
542
+ "# EXERCISE: create two plots in a gridplot, and link their data sources\n",
543
+ "\n"
544
+ ]
545
+ },
546
+ {
547
+ "cell_type": "markdown",
548
+ "metadata": {},
549
+ "source": [
550
+ "# Hover Tools\n",
551
+ "\n",
552
+ "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",
553
+ "\n",
554
+ "The example below shows some basic usage of the Hover tool with a circle glyph, using hover information defined in utils.py:"
555
+ ]
556
+ },
557
+ {
558
+ "cell_type": "code",
559
+ "execution_count": 6,
560
+ "metadata": {},
561
+ "outputs": [
562
+ {
563
+ "data": {
564
+ "text/html": [
565
+ "\n",
566
+ " <div class=\"bk-root\" id=\"c38f808d-a1bf-4fed-9258-253ce4ef9e5a\" data-root-id=\"1560\"></div>\n"
567
+ ]
568
+ },
569
+ "metadata": {},
570
+ "output_type": "display_data"
571
+ },
572
+ {
573
+ "data": {
574
+ "application/javascript": [
575
+ "(function(root) {\n",
576
+ " function embed_document(root) {\n",
577
+ " const docs_json = {\"8377adb7-59a7-478e-8e92-0f98b89873cf\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1571\"}],\"center\":[{\"id\":\"1574\"},{\"id\":\"1578\"}],\"height\":300,\"left\":[{\"id\":\"1575\"}],\"renderers\":[{\"id\":\"1585\"}],\"title\":{\"id\":\"1561\"},\"toolbar\":{\"id\":\"1579\"},\"width\":300,\"x_range\":{\"id\":\"1563\"},\"x_scale\":{\"id\":\"1567\"},\"y_range\":{\"id\":\"1565\"},\"y_scale\":{\"id\":\"1569\"}},\"id\":\"1560\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"fill_color\":{\"value\":\"#1f77b4\"},\"line_color\":{\"value\":\"#1f77b4\"},\"size\":{\"value\":20},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1582\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1647\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1565\",\"type\":\"DataRange1d\"},{\"attributes\":{\"coordinates\":null,\"group\":null,\"text\":\"Mouse over the dots\"},\"id\":\"1561\",\"type\":\"Title\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1558\"},\"glyph\":{\"id\":\"1582\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1584\"},\"nonselection_glyph\":{\"id\":\"1583\"},\"view\":{\"id\":\"1586\"}},\"id\":\"1585\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1641\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1572\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1567\",\"type\":\"LinearScale\"},{\"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\":\"1584\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1569\",\"type\":\"LinearScale\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1644\"},\"group\":null,\"major_label_policy\":{\"id\":\"1645\"},\"ticker\":{\"id\":\"1572\"}},\"id\":\"1571\",\"type\":\"LinearAxis\"},{\"attributes\":{\"axis\":{\"id\":\"1571\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1574\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1646\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1576\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1642\",\"type\":\"AllLabels\"},{\"attributes\":{\"source\":{\"id\":\"1558\"}},\"id\":\"1586\",\"type\":\"CDSView\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1641\"},\"group\":null,\"major_label_policy\":{\"id\":\"1642\"},\"ticker\":{\"id\":\"1576\"}},\"id\":\"1575\",\"type\":\"LinearAxis\"},{\"attributes\":{\"data\":{\"desc\":[\"A\",\"b\",\"C\",\"d\",\"E\"],\"x\":[1,2,3,4,5],\"y\":[2,5,8,2,7]},\"selected\":{\"id\":\"1647\"},\"selection_policy\":{\"id\":\"1646\"}},\"id\":\"1558\",\"type\":\"ColumnDataSource\"},{\"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\":\"1583\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1644\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"callback\":null,\"tooltips\":[[\"index\",\"$index\"],[\"(x,y)\",\"($x, $y)\"],[\"desc\",\"@desc\"]]},\"id\":\"1559\",\"type\":\"HoverTool\"},{\"attributes\":{},\"id\":\"1645\",\"type\":\"AllLabels\"},{\"attributes\":{\"axis\":{\"id\":\"1575\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1578\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1563\",\"type\":\"DataRange1d\"},{\"attributes\":{\"tools\":[{\"id\":\"1559\"}]},\"id\":\"1579\",\"type\":\"Toolbar\"}],\"root_ids\":[\"1560\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n",
578
+ " const render_items = [{\"docid\":\"8377adb7-59a7-478e-8e92-0f98b89873cf\",\"root_ids\":[\"1560\"],\"roots\":{\"1560\":\"c38f808d-a1bf-4fed-9258-253ce4ef9e5a\"}}];\n",
579
+ " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
580
+ " }\n",
581
+ " if (root.Bokeh !== undefined) {\n",
582
+ " embed_document(root);\n",
583
+ " } else {\n",
584
+ " let attempts = 0;\n",
585
+ " const timer = setInterval(function(root) {\n",
586
+ " if (root.Bokeh !== undefined) {\n",
587
+ " clearInterval(timer);\n",
588
+ " embed_document(root);\n",
589
+ " } else {\n",
590
+ " attempts++;\n",
591
+ " if (attempts > 100) {\n",
592
+ " clearInterval(timer);\n",
593
+ " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
594
+ " }\n",
595
+ " }\n",
596
+ " }, 10, root)\n",
597
+ " }\n",
598
+ "})(window);"
599
+ ],
600
+ "application/vnd.bokehjs_exec.v0+json": ""
601
+ },
602
+ "metadata": {
603
+ "application/vnd.bokehjs_exec.v0+json": {
604
+ "id": "1560"
605
+ }
606
+ },
607
+ "output_type": "display_data"
608
+ }
609
+ ],
610
+ "source": [
611
+ "from bokeh.models import HoverTool\n",
612
+ "\n",
613
+ "source = ColumnDataSource(\n",
614
+ " data=dict(\n",
615
+ " x=[1, 2, 3, 4, 5],\n",
616
+ " y=[2, 5, 8, 2, 7],\n",
617
+ " desc=['A', 'b', 'C', 'd', 'E'],\n",
618
+ " )\n",
619
+ " )\n",
620
+ "\n",
621
+ "hover = HoverTool(\n",
622
+ " tooltips=[\n",
623
+ " (\"index\", \"$index\"),\n",
624
+ " (\"(x,y)\", \"($x, $y)\"),\n",
625
+ " (\"desc\", \"@desc\"),\n",
626
+ " ]\n",
627
+ " )\n",
628
+ "\n",
629
+ "p = figure(plot_width=300, plot_height=300, tools=[hover], title=\"Mouse over the dots\")\n",
630
+ "\n",
631
+ "p.circle('x', 'y', size=20, source=source)\n",
632
+ "\n",
633
+ "show(p)"
634
+ ]
635
+ },
636
+ {
637
+ "cell_type": "markdown",
638
+ "metadata": {},
639
+ "source": [
640
+ "# Widgets"
641
+ ]
642
+ },
643
+ {
644
+ "cell_type": "markdown",
645
+ "metadata": {},
646
+ "source": [
647
+ "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",
648
+ "\n",
649
+ "\n",
650
+ "\n",
651
+ "*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",
652
+ "\n",
653
+ "\n",
654
+ "\n",
655
+ "\n",
656
+ "To use the widgets, include them in a layout like you would a plot object:"
657
+ ]
658
+ },
659
+ {
660
+ "cell_type": "code",
661
+ "execution_count": 7,
662
+ "metadata": {},
663
+ "outputs": [
664
+ {
665
+ "data": {
666
+ "text/html": [
667
+ "\n",
668
+ " <div class=\"bk-root\" id=\"0299e2d8-74c0-4355-be54-7a3c479e9e0c\" data-root-id=\"1693\"></div>\n"
669
+ ]
670
+ },
671
+ "metadata": {},
672
+ "output_type": "display_data"
673
+ },
674
+ {
675
+ "data": {
676
+ "application/javascript": [
677
+ "(function(root) {\n",
678
+ " function embed_document(root) {\n",
679
+ " const docs_json = {\"740e752f-547a-445f-ac84-cb2d3e2ca96e\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"end\":10,\"start\":0,\"step\":0.1,\"title\":\"foo\",\"value\":1},\"id\":\"1693\",\"type\":\"Slider\"}],\"root_ids\":[\"1693\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n",
680
+ " const render_items = [{\"docid\":\"740e752f-547a-445f-ac84-cb2d3e2ca96e\",\"root_ids\":[\"1693\"],\"roots\":{\"1693\":\"0299e2d8-74c0-4355-be54-7a3c479e9e0c\"}}];\n",
681
+ " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
682
+ " }\n",
683
+ " if (root.Bokeh !== undefined) {\n",
684
+ " embed_document(root);\n",
685
+ " } else {\n",
686
+ " let attempts = 0;\n",
687
+ " const timer = setInterval(function(root) {\n",
688
+ " if (root.Bokeh !== undefined) {\n",
689
+ " clearInterval(timer);\n",
690
+ " embed_document(root);\n",
691
+ " } else {\n",
692
+ " attempts++;\n",
693
+ " if (attempts > 100) {\n",
694
+ " clearInterval(timer);\n",
695
+ " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
696
+ " }\n",
697
+ " }\n",
698
+ " }, 10, root)\n",
699
+ " }\n",
700
+ "})(window);"
701
+ ],
702
+ "application/vnd.bokehjs_exec.v0+json": ""
703
+ },
704
+ "metadata": {
705
+ "application/vnd.bokehjs_exec.v0+json": {
706
+ "id": "1693"
707
+ }
708
+ },
709
+ "output_type": "display_data"
710
+ }
711
+ ],
712
+ "source": [
713
+ "from bokeh.models.widgets import Slider\n",
714
+ "\n",
715
+ "\n",
716
+ "slider = Slider(start=0, end=10, value=1, step=.1, title=\"foo\")\n",
717
+ "\n",
718
+ "show(slider)"
719
+ ]
720
+ },
721
+ {
722
+ "cell_type": "code",
723
+ "execution_count": 8,
724
+ "metadata": {},
725
+ "outputs": [],
726
+ "source": [
727
+ "# EXERCISE: create and show a Select widget \n"
728
+ ]
729
+ },
730
+ {
731
+ "cell_type": "markdown",
732
+ "metadata": {},
733
+ "source": [
734
+ "# CustomJS Callbacks\n",
735
+ "\n",
736
+ "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. "
737
+ ]
738
+ },
739
+ {
740
+ "cell_type": "code",
741
+ "execution_count": 9,
742
+ "metadata": {},
743
+ "outputs": [
744
+ {
745
+ "data": {
746
+ "text/html": [
747
+ "\n",
748
+ " <div class=\"bk-root\" id=\"39dc7b57-ce58-4986-af98-4b0fd3d9fe84\" data-root-id=\"1757\"></div>\n"
749
+ ]
750
+ },
751
+ "metadata": {},
752
+ "output_type": "display_data"
753
+ },
754
+ {
755
+ "data": {
756
+ "application/javascript": [
757
+ "(function(root) {\n",
758
+ " function embed_document(root) {\n",
759
+ " const docs_json = {\"7a41d4fb-1e8a-4316-8df0-8c23df8d6d22\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1766\"}],\"center\":[{\"id\":\"1769\"},{\"id\":\"1773\"}],\"height\":300,\"left\":[{\"id\":\"1770\"}],\"renderers\":[{\"id\":\"1780\"}],\"title\":{\"id\":\"1843\"},\"toolbar\":{\"id\":\"1774\"},\"x_range\":{\"id\":\"1758\"},\"x_scale\":{\"id\":\"1762\"},\"y_range\":{\"id\":\"1760\"},\"y_scale\":{\"id\":\"1764\"}},\"id\":\"1757\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1846\"},\"group\":null,\"major_label_policy\":{\"id\":\"1847\"},\"ticker\":{\"id\":\"1771\"}},\"id\":\"1770\",\"type\":\"LinearAxis\"},{\"attributes\":{\"data\":{\"x\":[1,2,3,4,5],\"y\":[2,5,8,2,7]},\"selected\":{\"id\":\"1852\"},\"selection_policy\":{\"id\":\"1851\"}},\"id\":\"1776\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1846\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"tools\":[{\"id\":\"1756\"}]},\"id\":\"1774\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"1771\",\"type\":\"BasicTicker\"},{\"attributes\":{\"axis\":{\"id\":\"1766\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1769\",\"type\":\"Grid\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1849\"},\"group\":null,\"major_label_policy\":{\"id\":\"1850\"},\"ticker\":{\"id\":\"1767\"}},\"id\":\"1766\",\"type\":\"LinearAxis\"},{\"attributes\":{\"coordinates\":null,\"group\":null},\"id\":\"1843\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1847\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1762\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1849\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1764\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1851\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"axis\":{\"id\":\"1770\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1773\",\"type\":\"Grid\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1776\"},\"glyph\":{\"id\":\"1777\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1779\"},\"nonselection_glyph\":{\"id\":\"1778\"},\"view\":{\"id\":\"1781\"}},\"id\":\"1780\",\"type\":\"GlyphRenderer\"},{\"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\":\"1778\",\"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\":\"1779\",\"type\":\"Circle\"},{\"attributes\":{\"callback\":{\"id\":\"1755\"}},\"id\":\"1756\",\"type\":\"TapTool\"},{\"attributes\":{\"source\":{\"id\":\"1776\"}},\"id\":\"1781\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1852\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1767\",\"type\":\"BasicTicker\"},{\"attributes\":{\"fill_color\":{\"value\":\"#1f77b4\"},\"line_color\":{\"value\":\"#1f77b4\"},\"size\":{\"value\":20},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1777\",\"type\":\"Circle\"},{\"attributes\":{\"code\":\"alert('you tapped a circle!')\"},\"id\":\"1755\",\"type\":\"CustomJS\"},{\"attributes\":{},\"id\":\"1758\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1850\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1760\",\"type\":\"DataRange1d\"}],\"root_ids\":[\"1757\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n",
760
+ " const render_items = [{\"docid\":\"7a41d4fb-1e8a-4316-8df0-8c23df8d6d22\",\"root_ids\":[\"1757\"],\"roots\":{\"1757\":\"39dc7b57-ce58-4986-af98-4b0fd3d9fe84\"}}];\n",
761
+ " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
762
+ " }\n",
763
+ " if (root.Bokeh !== undefined) {\n",
764
+ " embed_document(root);\n",
765
+ " } else {\n",
766
+ " let attempts = 0;\n",
767
+ " const timer = setInterval(function(root) {\n",
768
+ " if (root.Bokeh !== undefined) {\n",
769
+ " clearInterval(timer);\n",
770
+ " embed_document(root);\n",
771
+ " } else {\n",
772
+ " attempts++;\n",
773
+ " if (attempts > 100) {\n",
774
+ " clearInterval(timer);\n",
775
+ " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
776
+ " }\n",
777
+ " }\n",
778
+ " }, 10, root)\n",
779
+ " }\n",
780
+ "})(window);"
781
+ ],
782
+ "application/vnd.bokehjs_exec.v0+json": ""
783
+ },
784
+ "metadata": {
785
+ "application/vnd.bokehjs_exec.v0+json": {
786
+ "id": "1757"
787
+ }
788
+ },
789
+ "output_type": "display_data"
790
+ }
791
+ ],
792
+ "source": [
793
+ "from bokeh.models import TapTool, CustomJS, ColumnDataSource\n",
794
+ "\n",
795
+ "callback = CustomJS(code=\"alert('you tapped a circle!')\")\n",
796
+ "tap = TapTool(callback=callback)\n",
797
+ "\n",
798
+ "p = figure(plot_width=600, plot_height=300, tools=[tap])\n",
799
+ "\n",
800
+ "p.circle(x=[1, 2, 3, 4, 5], y=[2, 5, 8, 2, 7], size=20)\n",
801
+ "\n",
802
+ "show(p)"
803
+ ]
804
+ },
805
+ {
806
+ "cell_type": "markdown",
807
+ "metadata": {},
808
+ "source": [
809
+ "## CustomJS for Property changes\n",
810
+ "\n",
811
+ "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",
812
+ "\n",
813
+ "```python\n",
814
+ "CustomJS(args=dict(source=source, slider=slider), code=\"\"\"\n",
815
+ " // easily refer to BokehJS source and slider objects in this JS code\n",
816
+ " var data = source.data;\n",
817
+ " var f = slider.value;\n",
818
+ "\"\"\")\n",
819
+ "```"
820
+ ]
821
+ },
822
+ {
823
+ "cell_type": "markdown",
824
+ "metadata": {},
825
+ "source": [
826
+ "### Slider widget example\n",
827
+ "\n",
828
+ "The example below shows an action attached to a slider that updates a data source whenever the slider is moved. "
829
+ ]
830
+ },
831
+ {
832
+ "cell_type": "code",
833
+ "execution_count": 10,
834
+ "metadata": {},
835
+ "outputs": [
836
+ {
837
+ "data": {
838
+ "text/html": [
839
+ "\n",
840
+ " <div class=\"bk-root\" id=\"1ae2606d-6dab-418c-91f4-49c3a4b20a79\" data-root-id=\"1943\"></div>\n"
841
+ ]
842
+ },
843
+ "metadata": {},
844
+ "output_type": "display_data"
845
+ },
846
+ {
847
+ "data": {
848
+ "application/javascript": [
849
+ "(function(root) {\n",
850
+ " function embed_document(root) {\n",
851
+ " const docs_json = {\"fa7e062a-90ca-4f4d-aba5-763d88215896\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"children\":[{\"id\":\"1941\"},{\"id\":\"1904\"}]},\"id\":\"1943\",\"type\":\"Column\"},{\"attributes\":{\"overlay\":{\"id\":\"1927\"}},\"id\":\"1923\",\"type\":\"BoxZoomTool\"},{\"attributes\":{},\"id\":\"1922\",\"type\":\"WheelZoomTool\"},{\"attributes\":{\"line_alpha\":0.6,\"line_color\":\"#1f77b4\",\"line_width\":3,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1936\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1925\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"1924\",\"type\":\"SaveTool\"},{\"attributes\":{},\"id\":\"1914\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1909\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1926\",\"type\":\"HelpTool\"},{\"attributes\":{},\"id\":\"1911\",\"type\":\"LinearScale\"},{\"attributes\":{\"source\":{\"id\":\"1903\"}},\"id\":\"1940\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"2019\",\"type\":\"AllLabels\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"2021\"},\"group\":null,\"major_label_policy\":{\"id\":\"2022\"},\"ticker\":{\"id\":\"1914\"}},\"id\":\"1913\",\"type\":\"LinearAxis\"},{\"attributes\":{\"tools\":[{\"id\":\"1921\"},{\"id\":\"1922\"},{\"id\":\"1923\"},{\"id\":\"1924\"},{\"id\":\"1925\"},{\"id\":\"1926\"}]},\"id\":\"1928\",\"type\":\"Toolbar\"},{\"attributes\":{\"axis\":{\"id\":\"1913\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1916\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1918\",\"type\":\"BasicTicker\"},{\"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\":\"1927\",\"type\":\"BoxAnnotation\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"2018\"},\"group\":null,\"major_label_policy\":{\"id\":\"2019\"},\"ticker\":{\"id\":\"1918\"}},\"id\":\"1917\",\"type\":\"LinearAxis\"},{\"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\":\"2024\"},\"selection_policy\":{\"id\":\"2023\"}},\"id\":\"1903\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"axis\":{\"id\":\"1917\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1920\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"2018\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"below\":[{\"id\":\"1913\"}],\"center\":[{\"id\":\"1916\"},{\"id\":\"1920\"}],\"height\":400,\"left\":[{\"id\":\"1917\"}],\"renderers\":[{\"id\":\"1939\"}],\"title\":{\"id\":\"2015\"},\"toolbar\":{\"id\":\"1928\"},\"width\":400,\"x_range\":{\"id\":\"1905\"},\"x_scale\":{\"id\":\"1909\"},\"y_range\":{\"id\":\"1907\"},\"y_scale\":{\"id\":\"1911\"}},\"id\":\"1904\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"1905\",\"type\":\"DataRange1d\"},{\"attributes\":{\"args\":{\"slider\":{\"id\":\"1941\"},\"source\":{\"id\":\"1903\"}},\"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\":\"1942\",\"type\":\"CustomJS\"},{\"attributes\":{\"coordinates\":null,\"group\":null},\"id\":\"2015\",\"type\":\"Title\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1903\"},\"glyph\":{\"id\":\"1936\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1938\"},\"nonselection_glyph\":{\"id\":\"1937\"},\"view\":{\"id\":\"1940\"}},\"id\":\"1939\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1907\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"2022\",\"type\":\"AllLabels\"},{\"attributes\":{\"line_alpha\":0.2,\"line_color\":\"#1f77b4\",\"line_width\":3,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1938\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"2021\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"end\":6,\"js_property_callbacks\":{\"change:value\":[{\"id\":\"1942\"}]},\"start\":0.1,\"step\":0.1,\"title\":\"power\",\"value\":1},\"id\":\"1941\",\"type\":\"Slider\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":3,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1937\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"2023\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1921\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"2024\",\"type\":\"Selection\"}],\"root_ids\":[\"1943\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n",
852
+ " const render_items = [{\"docid\":\"fa7e062a-90ca-4f4d-aba5-763d88215896\",\"root_ids\":[\"1943\"],\"roots\":{\"1943\":\"1ae2606d-6dab-418c-91f4-49c3a4b20a79\"}}];\n",
853
+ " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
854
+ " }\n",
855
+ " if (root.Bokeh !== undefined) {\n",
856
+ " embed_document(root);\n",
857
+ " } else {\n",
858
+ " let attempts = 0;\n",
859
+ " const timer = setInterval(function(root) {\n",
860
+ " if (root.Bokeh !== undefined) {\n",
861
+ " clearInterval(timer);\n",
862
+ " embed_document(root);\n",
863
+ " } else {\n",
864
+ " attempts++;\n",
865
+ " if (attempts > 100) {\n",
866
+ " clearInterval(timer);\n",
867
+ " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
868
+ " }\n",
869
+ " }\n",
870
+ " }, 10, root)\n",
871
+ " }\n",
872
+ "})(window);"
873
+ ],
874
+ "application/vnd.bokehjs_exec.v0+json": ""
875
+ },
876
+ "metadata": {
877
+ "application/vnd.bokehjs_exec.v0+json": {
878
+ "id": "1943"
879
+ }
880
+ },
881
+ "output_type": "display_data"
882
+ }
883
+ ],
884
+ "source": [
885
+ "from bokeh.layouts import column\n",
886
+ "from bokeh.models import CustomJS, ColumnDataSource, Slider\n",
887
+ "\n",
888
+ "x = [x*0.005 for x in range(0, 201)]\n",
889
+ "\n",
890
+ "source = ColumnDataSource(data=dict(x=x, y=x))\n",
891
+ "\n",
892
+ "plot = figure(plot_width=400, plot_height=400)\n",
893
+ "plot.line('x', 'y', source=source, line_width=3, line_alpha=0.6)\n",
894
+ "\n",
895
+ "slider = Slider(start=0.1, end=6, value=1, step=.1, title=\"power\")\n",
896
+ "\n",
897
+ "update_curve = CustomJS(args=dict(source=source, slider=slider), code=\"\"\"\n",
898
+ " var data = source.data;\n",
899
+ " var f = slider.value;\n",
900
+ " var x = data['x']\n",
901
+ " var y = data['y']\n",
902
+ " for (var i = 0; i < x.length; i++) {\n",
903
+ " y[i] = Math.pow(x[i], f)\n",
904
+ " }\n",
905
+ " \n",
906
+ " // necessary becasue we mutated source.data in-place\n",
907
+ " source.change.emit();\n",
908
+ "\"\"\")\n",
909
+ "slider.js_on_change('value', update_curve)\n",
910
+ "\n",
911
+ "\n",
912
+ "show(column(slider, plot))"
913
+ ]
914
+ },
915
+ {
916
+ "cell_type": "code",
917
+ "execution_count": 11,
918
+ "metadata": {},
919
+ "outputs": [],
920
+ "source": [
921
+ "# Exercise: Create a plot that updates based on a Select widget\n",
922
+ "\n"
923
+ ]
924
+ },
925
+ {
926
+ "cell_type": "markdown",
927
+ "metadata": {},
928
+ "source": [
929
+ "### Data selection example\n",
930
+ "\n",
931
+ "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.\n",
932
+ "\n",
933
+ "The example below is a bit more sophisticated, and demonstrates updating one glyph's data source in response to another glyph's selection: "
934
+ ]
935
+ },
936
+ {
937
+ "cell_type": "code",
938
+ "execution_count": 12,
939
+ "metadata": {},
940
+ "outputs": [
941
+ {
942
+ "data": {
943
+ "text/html": [
944
+ "\n",
945
+ " <div class=\"bk-root\" id=\"dc5afbb8-24cb-4a92-b471-d05b1ba9a94f\" data-root-id=\"2082\"></div>\n"
946
+ ]
947
+ },
948
+ "metadata": {},
949
+ "output_type": "display_data"
950
+ },
951
+ {
952
+ "data": {
953
+ "application/javascript": [
954
+ "(function(root) {\n",
955
+ " function embed_document(root) {\n",
956
+ " const docs_json = {\"a7eb68e3-cc62-4b9b-819e-a953fed37813\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"2093\"}],\"center\":[{\"id\":\"2096\"},{\"id\":\"2100\"}],\"height\":400,\"left\":[{\"id\":\"2097\"}],\"renderers\":[{\"id\":\"2110\"},{\"id\":\"2117\"}],\"title\":{\"id\":\"2083\"},\"toolbar\":{\"id\":\"2103\"},\"width\":400,\"x_range\":{\"id\":\"2085\"},\"x_scale\":{\"id\":\"2089\"},\"y_range\":{\"id\":\"2087\"},\"y_scale\":{\"id\":\"2091\"}},\"id\":\"2082\",\"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\":\"2107\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"2094\",\"type\":\"BasicTicker\"},{\"attributes\":{\"source\":{\"id\":\"2081\"}},\"id\":\"2111\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"2089\",\"type\":\"LinearScale\"},{\"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\":\"2108\",\"type\":\"Circle\"},{\"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\":\"2109\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"2091\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"2206\",\"type\":\"AllLabels\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"2081\"},\"glyph\":{\"id\":\"2106\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"2109\"},\"nonselection_glyph\":{\"id\":\"2107\"},\"selection_glyph\":{\"id\":\"2108\"},\"view\":{\"id\":\"2111\"}},\"id\":\"2110\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"2208\"},\"group\":null,\"major_label_policy\":{\"id\":\"2209\"},\"ticker\":{\"id\":\"2094\"}},\"id\":\"2093\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"2209\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"2208\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"axis\":{\"id\":\"2093\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"2096\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"2098\",\"type\":\"BasicTicker\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"2205\"},\"group\":null,\"major_label_policy\":{\"id\":\"2206\"},\"ticker\":{\"id\":\"2098\"}},\"id\":\"2097\",\"type\":\"LinearAxis\"},{\"attributes\":{\"line_alpha\":0.2,\"line_color\":\"orange\",\"line_width\":5,\"x\":{\"field\":\"xm\"},\"y\":{\"field\":\"ym\"}},\"id\":\"2116\",\"type\":\"Line\"},{\"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\":\"2102\",\"type\":\"PolyAnnotation\"},{\"attributes\":{\"args\":{\"s1\":{\"id\":\"2081\"},\"s2\":{\"id\":\"2112\"}},\"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 becasue we mutated source.data in-place\\n s2.change.emit(); \\n\"},\"id\":\"2119\",\"type\":\"CustomJS\"},{\"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.5838538876609192,0.18233060400365808,0.06087576222579938,0.608689123268962,0.1391994955909951,0.8081642570312182,0.8739288056652311,0.3246203660102711,0.28973613582250823,0.06529565938762638,0.6610920813881263,0.14516806234932256,0.7115443930905543,0.1342445874642979,0.41335340978675417,0.9274711718531654,0.6422423877239744,0.9705984723833658,0.4457580050352664,0.8525363317036492,0.6818973140711277,0.9084268665549928,0.2254517738686076,0.7171818535893091,0.6218389434231782,0.37621763270622743,0.9303986202949159,0.7701560185707877,0.5202680848687673,0.7638761724125968,0.5733167782947652,0.26694282026798577,0.07797792058100961,0.7954379654155399,0.286205560163466,0.7589987682367622,0.6294638278410635,0.4572408472053794,0.7366667269368182,0.6709594182714435,0.9311888147733356,0.9493948006649765,0.9434159454680714,0.7732143579663573,0.12479168943717678,0.6162328717397211,0.4306471189665564,0.9129446431908135,0.279144618625625,0.40089866843979216,0.32992901806543995,0.7247962110133905,0.04274672975033911,0.7899712257808709,0.2571387639612551,0.46046376252250687,0.7109028794102686,0.12022395538027664,0.8696091978790833,0.05600067142653953,0.32007217866878146,0.3217923852475667,0.31595371144210194,0.2056989011487147,0.32278385002665044,0.8005670385739575,0.7225428769174846,0.8081633971234219,0.6552921842084152,0.8665341956754576,0.9942455206037761,0.4584034057143561,0.860073815806704,0.48092518640733894,0.26506904910467477,0.44848626771932265,0.7011769650781775,0.21163597383405486,0.6338667224354446,0.7500542482813366,0.41384801393903015,0.3995246579048791,0.3174080642608651,0.18702152933003646,0.19570393143983722,0.7689143170255915,0.613627774163108,0.47717167353833256,0.8630350712727877,0.5841126115823286,0.0926496462161639,0.3004661129944065,0.835665075224815,0.1300038105568908,0.3769677091703352,0.6260996634665903,0.3224281298222432,0.20493881369670075,0.37984172567581576,0.17802515383157091,0.03210339089754444,0.5670086268144184,0.807721618947062,0.17576229593456583,0.6325895418617555,0.8534681889909842,0.707820047866163,0.12280715754536575,0.03214589542976032,0.11409101435258784,0.27795936951193234,0.1283933833546439,0.5669597067572332,0.6232520612906356,0.7524348113331999,0.09523521583696914,0.5359352367971855,0.07347829454531196,0.41540841282815755,0.5746060095992671,0.17732106112695567,0.5482289359935881,0.2633444362126537,0.30230157809625624,0.955741964300102,0.6043457841919799,0.7497502242977649,0.3055853233825885,0.835157433508548,0.33883175673971777,0.28082864715359557,0.5843160199547246,0.6765423520297023,0.38797405782614647,0.547189265824088,0.7744956095272387,0.6182232840840981,0.565797933610038,0.8903861678914574,0.6778445760593127,0.004801354292366722,0.0433520144188162,0.8192551580038471,0.9065500194925947,0.9129915185016255,0.7715328737636965,0.26734667075196317,0.23320308342812401,0.46425181747200417,0.17323569543185224,0.4265484523277797,0.1853630863790261,0.7802367994075818,0.35837941208433177,0.9874279510610438,0.44646761589138484,0.9784365309736762,0.4880282092827186,0.4673375979636102,0.534398162557966,0.6920674747935252,0.05941806681974515,0.07117990313359202,0.30937786245504617,0.20222099567843166,0.38918918494466614,0.46705988282174804,0.6844863346538069,0.7642334113237941,0.3241940924315251,0.349514731628619,0.19340705555839877,0.6503495304453794,0.9792175086535049,0.2965184130663451,0.2892355491091323,0.9267468793460234,0.9569419344589466,0.2048614200508746,0.2971000285935267,0.7038012400973219,0.7040668731731119,0.7618812509439334,0.847775222323038,0.5388265856644622,0.5910518519374688,0.17583808343009477,0.1994770907440342,0.9471782832535028,0.10193877348268099,0.06806699275092976,0.29211057300505827,0.8450152542974035,0.8489495867894629,0.9393255763503585,0.002239655574727606,0.8343243028189591,0.7379389090748038,0.8328299307676084,0.3234155214850972,0.4942934264672125,0.4558683753254624,0.19074907973972555,0.26507555610665823,0.5341642097603257,0.10728704856910809,0.18910286923233344,0.9022201277499143,0.17756674637222725,0.2262174497445314,0.32568475872021374,0.753742056909704,0.3188307431959241,0.2437705667677218,0.9552704141114181,0.2503005331209186,0.5951146227486851,0.46975885832577446,0.8322461859554063,0.24296760785651816,0.39453840110733307,0.6956913453743092,0.8180751221633304,0.17470574479716416,0.27643478048764203,0.6041159397359741,0.13071055165978618,0.5958733327871288,0.6119374631561466,0.5615447730504709,0.502708105054082,0.5395837435902672,0.7001758841496637,0.858936394287835,0.1824685658752614,0.6993143242387068,0.14970719527042842,0.5789438130539635,0.09579995020407173,0.9335167128566675,0.6152727783105668,0.851710272725307,0.4065506997591959,0.7845655968324848,0.30036722686583894,0.44284818399753634,0.38858569278536925,0.6297229314284746,0.9494778080789479,0.8701935758150223,0.050306878032224556,0.6736004847695722,0.8003675166146956,0.8068249024438648,0.6489070231838309,0.5106401231993576,0.9687360566691936,0.7385942089777603,0.9949825889785008,0.3000715253339402,0.42493150626086706,0.6668034577763753,0.2628872900615681,0.03979573303238426,0.9299099463824202,0.034759711668256976,0.8117154078587102,0.010304362018284552,0.7539483816511949,0.20516666343072065,0.4017023863585344,0.24590477766757368,0.25537178815548056,0.14109228428032594,0.8496304822629503,0.4681235326155666,0.5676135971668587,0.1729179013269957,0.5739444241326054,0.5298564861577463,0.9181894299800448,0.1998448292910867,0.3580025413096851,0.407085829358365,0.1804949984001848,0.9571327455507354,0.06387133824128122,0.003130568671067202,0.10726183131857359,0.7172058779818271,0.5279886401915245,0.2108540251776393,0.7754674235816179,0.38299515399412964,0.5568375152741754,0.6035867276207145,0.8387520017790063,0.0049738171228430605,0.4514384353380324,0.8125772389593402,0.6853700278158374,0.019271836302002354,0.10840779241752185,0.5540837388308553,0.7536040781512487,0.5660471530576537,0.977413845169341,0.5439208989892935,0.16776035596847583,0.6799931708291089,0.03352303272078527,0.5062046690406403,0.7015354690023318,0.8950773497326823,0.5968322389051866,0.8928447718671729,0.7592611698122177,0.12257660328472175,0.1590517926349263,0.9379001408595303,0.4445985632605801,0.07661440975090184,0.33016652949955216,0.671863487792619,0.23972703478921942,0.14048536612456541,0.42528647685489085,0.24201101688455762,0.49992876932571617,0.7872656692676346,0.3888683122510127,0.18258510135276285,0.2645873553333413,0.34826084332717666,0.38558130310773475,0.5531715810473734,0.08950634625906706,0.8983143668878568,0.3717872051105533,0.19561215917625985,0.20590662959352313,0.010424633074655687,0.015935185400100305,0.043817839547074855,0.7752452624860273,0.4271572881069764,0.42198389368544675,0.79716206106754,0.8133659707207405,0.8202189952392351,0.7778709773723425,0.4540293488658175,0.9307647740967759,0.18270507980091455,0.779893194455724,0.5185017624060346,0.6518071764806775,0.429303898318534,0.8865278224158629,0.3410750133075925,0.1400958615922664,0.8736741305951117,0.06633743342297316,0.7432067131072851,0.9662531161047396,0.2633331683206276,0.4862842199743187,0.5623855208209328,0.026624281782479997,0.8228208032228709,0.6874039828060713,0.5142409067423147,0.18011058642777444,0.8942460402504169,0.8485882803267113,0.648116153221818,0.9577080194689394,0.5272738733397875,0.018620545732466076,0.32129938642009137,0.3650063146052578,0.24788167200260558,0.5641689297454403,0.07732909518852005,0.4597011334926826,0.21876822059837564,0.4398085261659259,0.9706065400870173,0.3477336727230882,0.3287223795393248,0.7702916302944806,0.31745647322630643,0.6199527610731175,0.6628373592029625,0.8224335299153391,0.02134473258621039,0.6139870749978935,0.22141186696531112,0.5496412460275316,0.21086029286347774,0.7301521941581282,0.08768617111453991,0.49474156329492325,0.2652347404673111,0.3922932082350288,0.6584987657778788,0.3760294114810816,0.4043391425742012,0.6307799793851986,0.2912122974844119,0.46432323238046136,0.663089946983525,0.7148000542399292,0.8635454956534417,0.9109830499045136,0.5312974085864588,0.7598254906589521,0.6172749162051187,0.08976584583821068,0.11566734582098159,0.816385385458258,0.4674019744420409,0.0937409269976831,0.56445744992636,0.9340487036073092,0.33483752453181526,0.3317588152627614,0.20971005769515194,0.97174417656079,0.7747779010890143,0.45738806767885765,0.9867596677287281,0.2808635706196284,0.09280878371355528,0.3050750224050849,0.48831430579401947,0.21310774332955384,0.8784026848058895,0.3135144023064146,0.2641954850695739,0.10843154309504033,0.9468923643221215,0.16877905333800558,0.6275319245821793,0.6566019071411991,0.9590778572786494,0.746606860163481,0.13425427168741544,0.23547644979051174,0.4142394041986631,0.9252171924480274,0.22329157556059975,0.4044532957174216,0.710990184966024,0.036832020843729385,0.2127094373089462,0.24171524529252997,0.22098130659305626,0.8326161601460694,0.7719904177214885,0.09210262120334267,0.015703312529675828,0.5396298010452402,0.5456401706370236,0.8288050763755063,0.9948418705869451,0.02476014992926745,0.060471687343916836,0.516855679412599,0.3726378009255653,0.14380730348212378,0.9020511238270948,0.17565569357278965,0.031962653525425155,0.7261882627427252,0.9507429005395389,0.8886845888293318,0.4977467977826431,0.9224879450718932,0.9485489949556992,0.4621866826823037,0.3119155697887518,0.3448726983050884,0.7450440465186962,0.45693439577793615,0.8330991444000139,0.572133388910892,0.7217014398229282,0.9601922734867905,0.6754826529052296,0.9184729148620289,0.5880964997296964,0.6741562833838202,0.352422885085665,0.30952622575760613,0.5421451644561784,0.9633864004324273,0.8378005384704373,0.47435496487940987,0.749151729263802],\"y\":[0.19533151348239308,0.19563569352513455,0.5026284951538674,0.548098472860606,0.21485938568870855,0.9002954404830917,0.30477482373195597,0.3864385323927101,0.8272922679000784,0.4922287963786838,0.21675471402604318,0.34412885414843053,0.3902205619182666,0.30770443022673843,0.8400514826542791,0.41845168993596205,0.9643887098670164,0.2434622785262277,0.7303774892239169,0.9249367507545649,0.9818382440330281,0.06259408746923445,0.12193570340527704,0.6422812364079967,0.46013570362670675,0.08144302222706701,0.30843452704546803,0.9668882393280693,0.26709555350980374,0.8453123088563352,0.14719119863463614,0.027710937483682252,0.8663183454551237,0.24791714994607017,0.082545956640518,0.3280195348312174,0.682377691308884,0.1988058273852168,0.6584590232111819,0.06759225726257923,0.9075865729465454,0.851426410265216,0.8378290586102398,0.8909351803017727,0.9342834979981601,0.5999470640081421,0.13436886204477472,0.7836478703607284,0.6507452744817507,0.9363132759978039,0.02141701921567085,0.040029963912921684,0.1257184752246172,0.6914745457286071,0.9385383943913238,0.49662979378187033,0.9719549915066232,0.3051734789852266,0.01426969350172036,0.8180177472738458,0.06833835191137272,0.7829983083078612,0.7832252840410926,0.8238267899185766,0.8949784082705713,0.0273359942817617,0.4356915891583477,0.5698566189011856,0.010233922931863648,0.36235906514735683,0.44064271390435505,0.6700809452423296,0.5964124274403865,0.8062362495774389,0.5597674336535522,0.015464976479533599,0.8181635625819033,0.22079873463220034,0.7894701039035023,0.049182821633738216,0.07045672433821826,0.8796979468760022,0.4941480321984091,0.28497032585619164,0.276772550209605,0.5758389505392216,0.8929449267079971,0.8846555918252796,0.17647760807104296,0.03438187458761699,0.1899136876249531,0.4531627734045466,0.6734754596066926,0.43404414701561633,0.6447833444853054,0.6750531005059324,0.6130714637091678,0.11361829077602281,0.5775334802285098,0.32037433460078946,0.32179903431777357,0.8522628547909636,0.31254786067766716,0.9713275061475498,0.35832336094218664,0.5998627926609128,0.7369306449255878,0.8239430042953969,0.5678978334080047,0.2637566697556134,0.2770890646948032,0.6789138655823462,0.47110205015450146,0.11567381644382846,0.1526262365889015,0.8351278435735129,0.259457320489182,0.9625983525780244,0.42628363439370376,0.8058560436594606,0.34487831227350774,0.2918812451381101,0.8571933707475416,0.7910857801891805,0.4862400861961421,0.09096915466213962,0.65924118288908,0.2530678506453622,0.7078258765409062,0.4233527102717254,0.8701107550832491,0.7736201095280275,0.18148496494611355,0.8546454441739115,0.21861265345516145,0.8608083495099851,0.06371070815842828,0.6625707293142584,0.37488567861595024,0.10045534622150465,0.5735937755548408,0.8977997095531125,0.12783863084253566,0.603664818167343,0.7745454363393262,0.9794126077276305,0.54902726627538,0.28112726697343593,0.17942486918474965,0.21299854199076318,0.512812205451418,0.5104296261224984,0.10254240773064882,0.8762073674954272,0.5786152360717917,0.7048402157225878,0.3358020216155746,0.7877114047899008,0.26537055342282967,0.8435535634034002,0.29561553125920315,0.8353625413611154,0.25995706257199447,0.4824320463136347,0.5113453193375731,0.490326467034923,0.7612405485600253,0.30980980482441156,0.7574933943104509,0.5296795630254723,0.412815044827735,0.33896497163670514,0.39917931726506173,0.9331199901096752,0.5807545341945067,0.2409468487463321,0.6036493909574533,0.0026633815494726543,0.4690867173116765,0.22920603447552113,0.8123936507995468,0.04511861059683675,0.9506384580038038,0.07317029010397358,0.09803840097726746,0.10478548654202058,0.062838348517809,0.061270704122011965,0.467804005553613,0.4673994830074466,0.31166568969349817,0.7036026836229726,0.6789424252600664,0.6000580979978478,0.8319183053095958,0.7882899945733495,0.736253896219322,0.516480186755091,0.4083979822538272,0.5716358338899622,0.7155377989295262,0.9764746473385241,0.9619226442927645,0.042569627133581145,0.4852342856179066,0.5242010189359078,0.9779570633570398,0.04276118145131669,0.388231241912817,0.12217252220625108,0.5257808681852694,0.9899012275009001,0.2303544561761549,0.5307066442789706,0.4346820713410593,0.360837917631168,0.15590635875352477,0.13097898258645568,0.7801269337756125,0.2912917150921097,0.06297723547561429,0.34388435107745985,0.15531476229036778,0.770649204738836,0.588308221575164,0.6288992962154591,0.5617993008057759,0.1651406087203524,0.6763298343922393,0.42590784162861395,0.22354229771719925,0.6919216724713847,0.670945460061231,0.38310591794990134,0.7132530775146033,0.3485337874683001,0.3196975999234891,0.8102821986635569,0.7087204585066523,0.42660353512727833,0.19507410448393936,0.9751940131522113,0.5679102833221918,0.4254103617327354,0.014392529979097346,0.2516332002673598,0.7448237308746842,0.8900133538102569,0.7900200385615853,0.7093505444527627,0.668757739116042,0.79382134986238,0.7187977089123677,0.44941109379652167,0.6270307745105389,0.6391068566057017,0.8126637173582723,0.4076222197517234,0.15408092247742877,0.5268281547905378,0.272585005268109,0.9603437536337752,0.0427556935330895,0.8203762764367194,0.10183318524343854,0.7164555568014013,0.70291859233301,0.4131517460228685,0.16551801946447997,0.6433143665699443,0.09946020520228205,0.1269543262225773,0.8687967006868009,0.28281620638661475,0.6970641266127902,0.3628568911899529,0.022687930497027442,0.41350236808014995,0.37305082358627084,0.8905688944863863,0.20651300888635293,0.4747993748312528,0.5406812847609421,0.577991600382099,0.1693382593220859,0.6910088853403954,0.08910595199306759,0.21289315601105874,0.8236960580049285,0.17514872558184869,0.6783723599072778,0.9612485725616802,0.4962220462677648,0.4699672530776178,0.1714816300533214,0.9355449521905456,0.7884108881891126,0.9138938050762989,0.607971013620197,0.7381160181299339,0.3701068800023557,0.20087026512040562,0.8732843966731143,0.7215718367838911,0.2875009640943844,0.09801771886545751,0.045891031612852906,0.005967367322292749,0.27678324378038754,0.9610517267425474,0.24482278461031526,0.6801090385570661,0.1403414001248583,0.18460994542765308,0.20881337472013928,0.6833150265866548,0.07307375109780079,0.17423262639586823,0.2740190705699226,0.9184832465851381,0.6331494741837717,0.35259831920131346,0.32684546038764617,0.9268769811208005,0.2126565912472823,0.2240477332933034,0.3625705404130848,0.33648327170983616,0.2738353087385038,0.9244740561801345,0.9330636940395127,0.28632387974431406,0.5180287443917272,0.2910779556792873,0.8031222404902406,0.1329127734566452,0.5973103903132831,0.9549539776156896,0.9441399188016028,0.13346417100862706,0.8260688065995448,0.4722028491982738,0.020341166358312845,0.5893440105384324,0.5991348388443669,0.6287502131289315,0.9682727090547159,0.5513918247488564,0.5477570643295369,0.2001149781492022,0.9982316238472122,0.8896969809586658,0.16196094988806753,0.4831198488404046,0.6276723335843453,0.3464524233571924,0.6477459688300059,0.5332086971494071,0.2984330399497114,0.7136942659865444,0.04941746846969075,0.8726710513605143,0.9064184608563275,0.11122489183501505,0.036550892131409274,0.6273155308361432,0.4202383787675016,0.10500415496393345,0.4363256596211187,0.7426246725301033,0.2736290756959201,0.881269835952383,0.061404075202719066,0.15422990774754675,0.49445228088756443,0.6700940128910335,0.9577051629859965,0.9155619625166862,0.5036167941785858,0.7656726611991419,0.2523266001477178,0.11039522943280566,0.6263039328514984,0.5035049283450376,0.45614592927866526,0.3297177309103607,0.1360071872627725,0.03030932799158359,0.728154216490686,0.30412107155329626,0.05671544831143149,0.8332043427248437,0.8168950640977692,0.33135877857233287,0.18817937227022685,0.502937485027264,0.19483230548615937,0.6650543247736971,0.5004042360511629,0.03665345532579389,0.19257460014026384,0.8852971166265516,0.16034011637808265,0.9251334408806157,0.8846341461987726,0.5595045602238097,0.9984609240015928,0.037250567295625925,0.5229830469780472,0.2582096118274744,0.29158528512250836,0.006571557882706358,0.0628524875714801,0.7419170540688518,0.898073915850872,0.29625102404517645,0.5489301438471107,0.8580523596450961,0.44915558296897806,0.16508496123431948,0.8379827575104323,0.9260293185102435,0.7538610068296163,0.17386367307567252,0.48205986593818273,0.8998390354603565,0.577010287635434,0.7505902539770345,0.5551334331929173,0.030198400694419814,0.36586405513670117,0.09784345047349063,0.5723461135867413,0.08067599132784453,0.2609764561017309,0.36826136929827136,0.7382151147651476,0.6394077766301444,0.6215053763188733,0.06147624800908613,0.18625704960167477,0.15447456899736023,0.9491379437776659,0.505153730567474,0.6771297915838891,0.3397935580223891,0.1296582373390831,0.7066707235324168,0.24005399437790675,0.30338682707356535,0.3327709459537215,0.8446660756846263,0.7737703818676714,0.24088704055339083,0.349049898976888,0.015578879307462268,0.7683571146465588,0.05338401398245163,0.559397122543228,0.8115877691270512,0.26818120074197727,0.010741842192185769,0.6435241991111199,0.9960414150707586,0.3235297068873093,0.028557774495566735,0.9945812853459357,0.011221313270246447,0.36258248473862853,0.699585694726494,0.8900985029323094,0.2992143379139811,0.08262112739437377,0.8230964970956165,0.8268546842519768,0.17546200000718726,0.5298844880295349,0.48374238391667623,0.7735179036802284,0.9973234166888144,0.6706058803839018,0.36346332548823557,0.8682920802359552,0.5958048295273115,0.570050645047369,0.7847237340451332,0.9592219178838375,0.11886158966886307,0.36741050840307066,0.1274312411839359,0.3878525735224634,0.6558637899515041,0.022073097010380183,0.2678060444283189,0.4031489205835944,0.45933988090897526,0.21915398957334842,0.49652075862080136,0.9714326656313677,0.09140823361565831]},\"selected\":{\"id\":\"2120\"},\"selection_policy\":{\"id\":\"2210\"}},\"id\":\"2081\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"2205\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"axis\":{\"id\":\"2097\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"2100\",\"type\":\"Grid\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"orange\",\"line_width\":5,\"x\":{\"field\":\"xm\"},\"y\":{\"field\":\"ym\"}},\"id\":\"2115\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"2210\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"overlay\":{\"id\":\"2102\"}},\"id\":\"2101\",\"type\":\"LassoSelectTool\"},{\"attributes\":{},\"id\":\"2212\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"data\":{\"xm\":[0,1],\"ym\":[0.5,0.5]},\"selected\":{\"id\":\"2213\"},\"selection_policy\":{\"id\":\"2212\"}},\"id\":\"2112\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"js_property_callbacks\":{\"change:indices\":[{\"id\":\"2119\"}]}},\"id\":\"2120\",\"type\":\"Selection\"},{\"attributes\":{\"source\":{\"id\":\"2112\"}},\"id\":\"2118\",\"type\":\"CDSView\"},{\"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\":\"2106\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"2085\",\"type\":\"DataRange1d\"},{\"attributes\":{\"line_alpha\":0.6,\"line_color\":\"orange\",\"line_width\":5,\"x\":{\"field\":\"xm\"},\"y\":{\"field\":\"ym\"}},\"id\":\"2114\",\"type\":\"Line\"},{\"attributes\":{\"coordinates\":null,\"group\":null,\"text\":\"Select Here\"},\"id\":\"2083\",\"type\":\"Title\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"2112\"},\"glyph\":{\"id\":\"2114\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"2116\"},\"nonselection_glyph\":{\"id\":\"2115\"},\"view\":{\"id\":\"2118\"}},\"id\":\"2117\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"tools\":[{\"id\":\"2101\"}]},\"id\":\"2103\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"2213\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"2087\",\"type\":\"DataRange1d\"}],\"root_ids\":[\"2082\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n",
957
+ " const render_items = [{\"docid\":\"a7eb68e3-cc62-4b9b-819e-a953fed37813\",\"root_ids\":[\"2082\"],\"roots\":{\"2082\":\"dc5afbb8-24cb-4a92-b471-d05b1ba9a94f\"}}];\n",
958
+ " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
959
+ " }\n",
960
+ " if (root.Bokeh !== undefined) {\n",
961
+ " embed_document(root);\n",
962
+ " } else {\n",
963
+ " let attempts = 0;\n",
964
+ " const timer = setInterval(function(root) {\n",
965
+ " if (root.Bokeh !== undefined) {\n",
966
+ " clearInterval(timer);\n",
967
+ " embed_document(root);\n",
968
+ " } else {\n",
969
+ " attempts++;\n",
970
+ " if (attempts > 100) {\n",
971
+ " clearInterval(timer);\n",
972
+ " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
973
+ " }\n",
974
+ " }\n",
975
+ " }, 10, root)\n",
976
+ " }\n",
977
+ "})(window);"
978
+ ],
979
+ "application/vnd.bokehjs_exec.v0+json": ""
980
+ },
981
+ "metadata": {
982
+ "application/vnd.bokehjs_exec.v0+json": {
983
+ "id": "2082"
984
+ }
985
+ },
986
+ "output_type": "display_data"
987
+ }
988
+ ],
989
+ "source": [
990
+ "from random import random\n",
991
+ "\n",
992
+ "x = [random() for x in range(500)]\n",
993
+ "y = [random() for y in range(500)]\n",
994
+ "color = [\"navy\"] * len(x)\n",
995
+ "\n",
996
+ "s1 = ColumnDataSource(data=dict(x=x, y=y, color=color))\n",
997
+ "p = figure(plot_width=400, plot_height=400, tools=\"lasso_select\", title=\"Select Here\")\n",
998
+ "p.circle('x', 'y', color='color', size=8, alpha=0.4, source=s1, \n",
999
+ " selection_color=\"firebrick\", selection_alpha=0.4)\n",
1000
+ "\n",
1001
+ "s2 = ColumnDataSource(data=dict(xm=[0,1],ym=[0.5, 0.5]))\n",
1002
+ "p.line(x='xm', y='ym', color=\"orange\", line_width=5, alpha=0.6, source=s2)\n",
1003
+ "\n",
1004
+ "callback = CustomJS(args=dict(s1=s1, s2=s2), code=\"\"\"\n",
1005
+ " var inds = s1.selected.indices;\n",
1006
+ " if (inds.length == 0)\n",
1007
+ " return;\n",
1008
+ "\n",
1009
+ " var ym = 0\n",
1010
+ " for (var i = 0; i < inds.length; i++) {\n",
1011
+ " ym += s1.data.y[inds[i]]\n",
1012
+ " }\n",
1013
+ " \n",
1014
+ " ym /= inds.length\n",
1015
+ " s2.data.ym = [ym, ym]\n",
1016
+ "\n",
1017
+ " // necessary becasue we mutated source.data in-place\n",
1018
+ " s2.change.emit(); \n",
1019
+ "\"\"\")\n",
1020
+ "\n",
1021
+ "s1.selected.js_on_change('indices', callback)\n",
1022
+ "\n",
1023
+ "show(p)"
1024
+ ]
1025
+ },
1026
+ {
1027
+ "cell_type": "code",
1028
+ "execution_count": 13,
1029
+ "metadata": {},
1030
+ "outputs": [],
1031
+ "source": [
1032
+ "# Exercise: Experiment with selection callbacks\n",
1033
+ "\n"
1034
+ ]
1035
+ },
1036
+ {
1037
+ "cell_type": "markdown",
1038
+ "metadata": {},
1039
+ "source": [
1040
+ "## CustomJS for UI Events\n",
1041
+ "\n",
1042
+ "Bokeh also has a general events system\n",
1043
+ "\n",
1044
+ "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)"
1045
+ ]
1046
+ },
1047
+ {
1048
+ "cell_type": "code",
1049
+ "execution_count": 14,
1050
+ "metadata": {},
1051
+ "outputs": [
1052
+ {
1053
+ "data": {
1054
+ "text/html": [
1055
+ "\n",
1056
+ " <div class=\"bk-root\" id=\"ead7aa65-c9d0-445b-b7ce-d451a59774a7\" data-root-id=\"2305\"></div>\n"
1057
+ ]
1058
+ },
1059
+ "metadata": {},
1060
+ "output_type": "display_data"
1061
+ },
1062
+ {
1063
+ "data": {
1064
+ "application/javascript": [
1065
+ "(function(root) {\n",
1066
+ " function embed_document(root) {\n",
1067
+ " const docs_json = {\"98bde7b0-f3df-4fad-9c82-3b265eba6b4f\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"children\":[{\"id\":\"2303\"},{\"id\":\"2304\"}]},\"id\":\"2305\",\"type\":\"Column\"},{\"attributes\":{\"width\":400},\"id\":\"2302\",\"type\":\"Div\"},{\"attributes\":{\"axis\":{\"id\":\"2288\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"2291\",\"type\":\"Grid\"},{\"attributes\":{\"overlay\":{\"id\":\"2293\"}},\"id\":\"2292\",\"type\":\"BoxSelectTool\"},{\"attributes\":{\"below\":[{\"id\":\"2284\"}],\"center\":[{\"id\":\"2287\"},{\"id\":\"2291\"}],\"js_event_callbacks\":{\"selectiongeometry\":[{\"id\":\"2307\"}]},\"left\":[{\"id\":\"2288\"}],\"renderers\":[{\"id\":\"2300\"}],\"title\":{\"id\":\"2402\"},\"toolbar\":{\"id\":\"2294\"},\"x_range\":{\"id\":\"2276\"},\"x_scale\":{\"id\":\"2280\"},\"y_range\":{\"id\":\"2278\"},\"y_scale\":{\"id\":\"2282\"}},\"id\":\"2275\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"2408\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"2406\",\"type\":\"AllLabels\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"2296\"},\"glyph\":{\"id\":\"2297\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"2299\"},\"nonselection_glyph\":{\"id\":\"2298\"},\"view\":{\"id\":\"2301\"}},\"id\":\"2300\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"2276\",\"type\":\"DataRange1d\"},{\"attributes\":{\"tools\":[{\"id\":\"2292\"}]},\"id\":\"2294\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"2278\",\"type\":\"DataRange1d\"},{\"attributes\":{\"args\":{\"div\":{\"id\":\"2302\"}},\"code\":\"\\ndiv.text = \\\"Selection! <p> <p>\\\" + JSON.stringify(cb_obj.geometry, undefined, 2);\\n\"},\"id\":\"2307\",\"type\":\"CustomJS\"},{\"attributes\":{\"icon\":null,\"js_event_callbacks\":{\"button_click\":[{\"id\":\"2306\"}]},\"width\":300},\"id\":\"2303\",\"type\":\"Button\"},{\"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\":\"2293\",\"type\":\"BoxAnnotation\"},{\"attributes\":{},\"id\":\"2410\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"2285\",\"type\":\"BasicTicker\"},{\"attributes\":{\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[2000]},\"y\":{\"__ndarray__\":\"oaeIWwkpRkA6EIx0NKxOQF6NiOAcN1NANX3ThVL3NUDir4U2v7hYQOCv/fB18S1ALPgcU1D9PUDuwelg44xMQPfNutICwFBA50+0B0ZhUEArhNKm1BNVQKs25EQrQ0RAHUEdAAWBRUCp/GaFvJ1RQHQ2+LbB/TNAgJnXy4c+R0BolXp00eUtQOO/rH/n7ydAmRITRFblVkA7+4m5Z/0wQKBiasHHDFdA5N3umNXEVEDJfBOu3ZQ0QC0GQmr74ilATl1ozADyIkDH6ToC22c5QFP6wurKXU1Axh1or2ITWEBHpJLQKTgoQN0ciIz/f1FAoFMf2on2IECsj3CfdVBYQBJHpkxc2VRA1MgfqxmaUUAudlKufXxTQC3Xgy6GykRA5hiSbsc8TEDDGMHKsH9VQGONgjLGq1VAJo3YYbcpTECNN5x5T2sPQOnKqQodQDdA2r2CzD+pTEC0nGn9enBEQJijvNuP9khAkhkvvJ1xKEDNHoBhsgVWQDBkZ+ndIlBAxTBA9ZcDUUByanIiU85PQFbx54eyEzhAzNLHqN8LUkDekuFmZkNHQAMk4JTCs0tAsmUIl0KvBUCsi79opi5JQD3b45pVCCBATrrNYZEvUUD9ZeVPtChSQM+olQwcqkFArctilmqVUEAjJM1mQFcKQJxX/J2mxVVAEhkmG6rTF0D7lmYiSQZCQMZxF0R9D01AykQTArKtNkB2vYCaLaktQL6O+6jFo1dAfUfBbesSN0DLoXSPxSxXQB2/g3sv5VdA8gSArVciVkC/oM5HmBktQA5jxLpggEFAZ8kyt8HRJEBXct8XReVJQEmTRDcBgFFAIBi+1BqsTkAnJvvIvcRYQCtZWfL1b1ZArGCuLMGXVUCHHrizyUpOQPWudKbCRURAS/RnKLfqPkCgakBV+EVYQKLaEzPBayNAkOIelPH5S0C8fpFvnDJYQBmfpILslUBAgTCTLgCsUUCy3H/IsV9TQAalfuXcO1BAxcEROtQIUUCo/wCFk4dTQJAGJOfeHv8/LHblKoDUGEAmTq0j2xRFQOeFXt6Ye0pApyQOcn0TU0BPWiEGeHBXQB4f1zKMVDNAFLnDGqOgNEAVnUf6b5pUQFJBHSPhw0xAiIyobC3YLUBmDg1YDf1AQPxkEDY8GUNADMRgKUiDVEDNvJAlGttSQHrF7SgOV0ZAm6shHbcnUkBuAmhhOX9WQLeSFeiifiVA+d1eA22bV0B+W2iA8kkKQHXFfyOjR09AC8lieXYtPkAvjWyaFA5MQMmSDCXAb1FAhZfc3D4WUkDPftieY6siQLl9P9GvRk5AnRUST3qHV0By48pyjflGQNqEJ/1SPCpAFdefWLI5RUA0UKEqRkLjP2Wkex1wv1FAnDNkZj3dVEBbDFTN+xBUQHUIGvGdlURAAMPfYfPmWEBgSAJvNl1IQPAAfpZT6FVATo14YHBPQ0CgHRHE3rA8QC5EgFpN5UZAsUJvlzGwQUA8pLb9u4g7QAUngJi8uShAMK2lYAG5QUA9/IcNkDBDQC7BgSrm/U1AXTWWF9bhQUD+kkei2AFHQGivA5ZnflhAuegHaU/iT0DxrQGfUENPQORl+Rs7FO8/zEKZdZB8V0ASjMw6SddVQE0UEczoDVVAMPKQ+65lQkDfibwsETBEQAEmKnS520BAm6NEZTStJ0AAaQaQ5Js3QGI9wQ0h9lBAjGGbKPDcSUDSh/yzcO0/QKahBubgmSBAGmynSYKLPkBGGZ4uYctMQOTfXfaL2+s/EZ2lSbJDTkBR6FeOmKFYQIDKaC33yFZAz+x+eHDgQ0DX8tko8d84QOEsQ4d0qzVARPSMGjl0G0ACxQHD9pcxQEidqDDlKDJATKm2bdbOU0DG4EZKcMpSQFP7fZoWE1NAjuEv8BHuREBHtCIV6IVXQDaDMuIbflBAl/yVBUYwSkCxgq57b+ZVQO8TunOYf1hANYvYDVmBK0AoL4Fx4fYxQFBdbyfsZB1ANMstHykVJUCQ4A/Wr0pMQMH0vmXJplVAAh3YOep+VUCG8W7z3C5VQH6Al4QndiFA+J5k+QmTVkBaSKyQGuFOQGeokW0/HlFACY5/T7lHV0CuGhs7SqhHQKkPBUPCt05AUO29KgqJUUA8LNgXet9XQLB/+b5GqFZArv9yMP+6IUC219/tf4FNQBI/b/aY8D1AhzbBAkcpUEAZB/1+bK1XQKjyYvAgpStANR8OlKvSN0Com/Y7lmVGQOXdSZyrpFdAE4Ue7Jb3VkBGJE/+KihKQAAN+HQ3DVhA7PZXJVQ5QECcbQbm88pSQHpsY2tUSVZApTf4z/z/VUBEdWK5DjBXQNBAV89P8TVA8d61kipVQUBfq3N5hJQjQAE4srvAn0hACun/J9xdVEDqbBVG6Tk/QP8/Bi3cRjlAu27Vf/BLOEDUcufiL89UQD3+r7BExldAe1G3FmXnVkConD0TxtVEQI6Uo18Y41NAE2uuluFXR0BAPcwNdQzdP8V0BG33sFRAvyi4zdDZSUCoozhP7BFSQHqFOWbONEFA+vJE/vPNUEA9+K1vMCREQHw2N4mnV1BAZptz3g0GUECAyW9fPb09QNsHITPAXxJAUNijFAk7KEB/mmAnTPlHQBt+2ZzZXzVAAIIih3CxUkAQByBzeIRGQLmmOF9RhUxAFxTGquQPVUDO29mawbpWQHXnp6tALlRA6YgPfRuiV0DWSbVbPP4rQOC901m8+LU/CPn+EiZrVkCb00cbz4NGQD8noowR+kZAg+1po+v2RUBu0zpYjEv3P9EzF1RGxzhArgB3rHMvS0ClE14dXDg2QIFxrBEjKjFAgin/h/RlRUB4D+siX80xQBQAE5rMwBpAbq8uAXaNO0AQ7qqz5u5NQE9RsBj3OjNApOUyo7k6WECxUHT+CMlVQDLXrD+JkkBAFzJgbCtNUkCYe8GWxFlQQKbkuQLD3kdAYQHu4evmVkCq/jS+LZxGQFDcW2iDThpAeU+54nTGVkBzJ42IIhdTQN1AoBL2XShAgb52KqvEPkDJ8umeULBJQO4JB+jbAFhA8DLAGBl1OUARUUaDMp0sQI7IbWdtWTJARWRIqtK5RkCbqsfwjDFFQIXmtE10OENAJ75q+F85TUA0/k9oIcFTQF/gC313IDlAEmigZRDxTEB4IbqSL/ZLQFhhOI/kPVNAe6ia0DysVEClOcNvdeZWQL6Y2NELCjBAN4Z5yWo+UkAsMxq2CN3nP5JFHKe8FC9AHtBf+sbQLkCMpOWUoXhFQLVNoTPOc1dAd0H1zy/fV0C6caPnxGRRQFU9Ia0Z9jpAkpkw6CqROUAQJZDPi2gcQIIa1Emv+VZABKz3EixZIEBkAc4VMYw2QFj71EO6CSlA4WdhC5V6UkD2FKFDkmpDQL2hlHE/N0RASxJSL4IqVUA8hV7N8hFFQDVIH2jyZFFAx0bNeXKqJkB3tUjxtQxEQGEtWkeyX0FAhUdc6gKJVEA/73XsKRIvQL1CRrXjA1RA85IDxGmORECg3oAnY/tNQLH7Xr0GpzlAAgJxXcY+WECYw9Vdz+VYQG1+LCENc0FAKCSTwqvZTUCWa3RkEgpCQI4lduRN1VhAwMjp27u/P0CrNlRUPANTQO+LmslIGlZAv0tGnqrvSECEhhchCMklQAvyriCELFNAXHEQ9iXCVECgyIw4hfoyQFzBarNK3iZAUWDBRQ9bVkCgqQs0pRUsQCdM+PmqrCRA84m/HUGTT0C3FnNhCxJQQETEPe8zF0JA2o3Mx/5dUkBHROje0p1KQN4KtCASAFZAsvgTMhgGS0AZ/PuQpA1JQEaPdwWMiEdAY1pCbkkGSUBQc26b+5VQQALWfstZ9ThAv9ad10BiTEAN/Hp9lIdVQMDUOnhIZ1hAKjyZdPjpV0A2G/MRpV5WQLOatnUl8lFAORg9oqkOQEBmCqjEaDFCQCFdeqFxKxlAQIjARNnHWEDRTKSGBKg3QCBpO+8ImjpAQNlmQdV9HUDmjx3ju3tOQB3yU1FxqzlAkJbbylKpS0AaAxAL519XQLfKB3ESi0RAuFMSYEpyOUDw6Ai7PpFBQIKdZgJaV1dAzyaQoFX4JkDXVybiN3lDQCQ4BttUSkxAa6CUCYUTTUAyBqrUWYJTQOvZqyM2zVVAA4eO/FhKMECupHvC0BBYQBCgFWWhlk5APbGskijmVEAjwpNQaSVRQF58t7EYI1ZAYArPoEWTQ0AOXJpHvVREQOcuXKTn6FZAfqU7lOATRkAty++93MNHQHdq8Gvex1hAewCWGEtQB0CTnlH0I2oYQJy7XaCF1DBAbmSpCmvfREC+BarlwFtEQNAnd3icYFFAxp1ljUnRU0DXGb/XnqBGQPhCiHZEYzRAB0kvZDDWSEB093F6JvxRQE7mqnKbt0BAbvD5j3zpV0C8t/bzS2QUQAQxaiRRMO8/7B+6q4b3WEACSRktMmNSQF7cGWGOizhAtgvPQC/SUEBhKFIg0d5UQMe5Btm2LQ9AlT6OU83BU0DZ7d2icE5XQOFD7Up5FUpA4lUSWfRSVEDhj2UmMMhWQHnHv1vxyU5AHAlTpKOWJEAEm+/cY5tSQF/mTHR4ET5AN0Zx8KVZRkDCM1EE4idSQJh4zlT3z0ZAmuMcuICjSUCLZRmdPo5NQNbqWMByRyJAvUrt8/aUAkC80HwuYtspQKF7ccTeqlhAsCDCOVMvPUA+HUNgh/hDQMoWq03VD01AXywuqt5DVED0Po1v/4hXQIaQ4JcKDldAzFZgNOD2QkAq1CH1QqcbQJ/F02VQclVA+PtkAHeIVkBNJGq5fktVQEKzec1ENFBAQIOdCVzEVkD8yzPc2EpSQKcpK/NaSCNAZfFGKosWSkDtuNdJ/O1WQDtfym/MBDdAU7iRdLNzTEDHt9gagbRKQE+0UgqiXVFAzZLshlsIOECLNsJ/or1IQD9KOUqSVVVAf/ye2+2KN0Acltz1BsxCQC1Xc0gHskJA4ncrWodeRkAuavD4rYRWQGKYU6OIuVZAYMqwtFTstT+tkLBKcWs2QGQrj1xJZ0FA4CatCq2XtT8UnW44DPNGQF98fOqZCURAzBm4HNVOUEAI269sqGxQQAOcvj7W/w5AzcuYHoC6NUDDwB14aEtQQNCT093ALk5AIcZeNfnwRED85XZt9hhCQDsS3cCBdTdAuFfD3Fpx1T+QYo5BI29GQK4ZVl8y5ExArLu+s5tzU0AaOhOKVTQ4QIWvquZxmVRADIaSTlobKECNGAUp19FGQMIKjidqBlBAwf8br7hkOUCTvU8OW/NDQEFBkxPITldAbonaQl25NkAlOFy+Aio3QPkNTwJBW1ZAqVBxaaRiREBYo+DinN5SQA3hnn60/UJA9khS2j2FWEB5dtjZoA1OQAo2OPr2k/s/b7qi/KoHNUC8mEy4+VBTQB7yUvQ+QFJA0zTet4RgA0AQA9syCtFRQHhQSrc4eDBAgTZYek6dNUB+naWMRcYxQNYRbzfFxDdANFdZ1hn3UEDPVCRGN903QEJ6B2dnAUZA9pr7XVBgMEBeiPXwLf02QFUVBb5jIFdA6t3vyrhKN0BDLMdP5whXQAzu5AozmlJAaA4UPoNEQkCVKOsWbYNFQNQJ/xOxiVJAfDrAQxMeO0C19aCjJzcnQDyNYuI/5UpAipQf/iveUUAArlzz3rlTQEq3p6soFUhA+Hhzd+6+VkAKUIWa4l1GQIv/srFhvENAaNH0R8TgJ0An38F8vvAuQDUVVQ1si1FAntaR3al/FUD8Xeur9X9UQATtl+i6ni1AriANj1vdEECWcomunDxSQAPYb59RYlBAAgKkOqseI0CIczg5zTYwQMEIBuQzzFhAVxwX9ddoVUD8lfXEoTdRQBneAkkoOzdAst85WDk/I0BQAYBlTXtRQJAoLZXLqVFAeHfJjvQFN0DhEsED1NtBQL9qPjm+OUZAyBNtaOVk8z+lJlmSSPw7QKBUYKof7khAKLlqd/E1TUCa4hI+/Z5UQEWi0Ecjp0hAtrKhk4PkUkAPkyJZckxNQGdqrWV5cANA+jQCq6d/TUB7J1iM7pNQQLfkv7JETkdAGQCiX6iARUDsjokdBEriPwFEWFN1ZEhAuFklRUKMNEDcb0Rz5gxPQHKXbxBeHkxAIhXkif31NEDeY/xTjtwWQNFT5wp4I1BAIr25eZmTNUCAfQrl8mwgQP1nhm3UDE5A5RacFrIBTUA66zv/OL9PQDt+IAK8OUxAAKZr/r7gRkBKs+YWO61UQO4H5H3UeihA5kRf55j5VkDgc++HjYcFQD58JwyiHlJAcD6DZeaCS0Bc4TA3mXk3QEUIUpJUvCxAqQyo3ZQEVkArrRBa/3xRQAAgkX1zYE1ACU9MHvjxSUCDGJAPV/9AQPykKP/t90lAvuBkmOgPQUDYlBFtdfROQF5jl5VBkE1AjMZ/EgteO0CRPssGPhtEQHY6S92Z1zRAq8g1mb/4E0C/RRhP/rlMQD9DCuXirEBAQnbn3KjcLkD2bsk8Uq9VQNhs0eOCzldA+dVONJzCSEA4AnuTzZxAQLwRZ1emFkNAE06lATUfWEAkoq93zjFFQN5B9ucuPyhAb4T8fX3cMUDdX4Vvh+YOQBBLDFYati9AuWafHk8ONEAMMNEbWFBWQJzNX5ziO0VAOuztUl8TR0AAzd723pJRQBvk8G0p+VNA6U+zU+4nS0BjhyjKmvdCQCrpbB2XPRNAiC+MpgvWQ0ATN9VwCtQoQPnCVtJtcC1AK35BNWEkV0CiC8ofy7BVQP9oWy06j05AQK5eta61wT+q3+u1UaFHQBMoiFQh7VVAEz2rznU2PEAAq3aamuFDQLleKYF2sEZAD1RXtEUtVEDixTH0eFVOQAEPBVUDXUZAKQ+S+Q3DMkDCe32RwkRUQD25ABKWH1JAWNmv/sl7I0Cd7UPdsc5IQBVoMCiP70tAfNfrTW1BOkCkBlEQK8dHQP3+eiojY1dA5AmXdmhEM0DL8FENHSlYQEiw5biLzUBAxdx2GkvEVEAeIRMyBCsdQDOM3zr6D1NA8+DANj4qRECciqz/dhJQQHWjlq1t3zpA6CJBLRuZS0C7wEFfeZA3QBcNInqKelNAMtCKSm1BUEDugEfkWO5HQEv0UJR/DT1AgJH6D1fkWECn7B/jdYJXQFJc6KT3qUVA32HvU+avVUD1u7W5IKBRQNMeGEne4yhAtXFOaLo3Q0CU2EvlLpgrQB/nZCrgl1VAqrZ3wA0hRkDtDi7W2TQ7QIscdZJvPklA57vLRKtjU0BSUpSqJJRQQHy39OVsYiJAzenc5KkvIkAe+x11oGZVQAscMu8R21hAxH5Frp4BLkAKBivEjUYRQFi/fp7KJVBAP1mUEzcuBECXsEny+lxTQEq4NrlMQ1BAo2R9inkyF0Bp30/3o45WQJIwgr+5QT1AfAv+ynvcKECSly/SagRVQLW/Itgr8FRAbieqX7+US0CfrWJLKRNJQCtzd7BtuTxAD/17pJkQUUDTO18m7oFHQCYroMIMCUBAvuQw0lchSkCWJ0tdPTpVQCceA4uAtENAZayvHIGNSUB9Pu21/PdIQJZVJSO6oldAc6WmsTonM0Bkz2NgNZdHQMe1+cLaMVFAroGxDtgMM0Apagnw6chCQN3w8FT1EkVAXu3PMD5xUEBBYQZoNzJGQCzpRCiLXU1AGqIFCg6gSUBLpCdTNAkzQLQbDY9KpRRAui75+YNsUEBS4iCTEEdAQAwmWluVm+4/4pGN2UG0LUBw6Z+33ZtVQFLajrH/NFdAqYD2b67wU0AiYSSkcQX/PyR0euVUv05AZGq5lB1dRkAccuDYHf9MQLITIB1ktFdASSLrp2N3QEBioUJ9p0ATQBrw4KB9kjFARtfi+CM3IEACRm4ovbAxQKPfigxJjU1AjXsgnlkCUkCqX4wW/BggQDLI56BeOldAZVqfmPBwVkDwREJ/+65RQPBvBWFaDE5AxtTChuRxM0CeTuYWkoJLQHEeyFNL3FJALUHkKK7QVEBKpBvCgDk7QKWJIT3YR09A8MLc0lnuUkDmN9b6j0pJQOxRWT/mj1BAg/KPmSypQ0BHAaDQLLkkQKsy7oOAL1ZA2GlX0qr2VkCRm/u8UHEmQKxUukDVv0dAldFwjb3xQUD75NQ70CJVQBTDICVXJ1dARmypG8k8VkDOMtG8HDQ4QE81Vn9c9kNAnAheTGmnTECCuo6HZt9IQHgYMm6Qr0xA2rN42msDQ0C/KGkHURBOQIhwHLehqj9ADKO0I7BGN0C5jmByaVg6QN6n8EOJGBdAsK7KsWZ7UUDrKGgifT9UQFXiqB8YYUlAMqGCfoHjQkA8n7g76Q1TQMqNkHssmyBAVdoXlW5oCkB7UxzToS81QOIAenIpHE9A/++jxnV3VkDKPiUXC/QmQJpBHUOauU1AZnARQPQj+j8bZsU3Uys5QI5z4Owkk1VAxPet4c+eEUA6/Prij4NUQKo3JTuXS1hA98JNb6FkOEAeP+HCV1dHQM7cIz0yNUJAd2Mk4xRGUEBnZdtad0pOQIpXR7nux/E/LAUnbEf1UUC7uYdr9TdPQAqzJGRD6EhAmZi8cZeASED14UDG+LJNQERicmRtXkVAHexk8YZ9TEAYublpb+RSQNPWWfLJBk1ATIuSgp8RUkCTOxB/jyxSQAjUpMQQGThA8fxSJau6REBeZsDWaExQQB3aR7Z9RFRAUnLySNgaV0BQqMRUjtRHQKY/wDmDQ1RA+YWXpIgaQkDMQzTqjVxSQFRCbqo5KVhAoTsETBJJDUBIxkaUdU1RQPDD+1HlczlA14S6bkVKT0Cj/aGlUAtLQLpQLh2WojFASqa4BAgHQ0A43XpcOhpAQAKgGJGX8DpA+U7DqjOhQ0BYkZ/mTqhRQPLaB6cZ5zJAlx3zgGbBGEBLfYB3/HlDQMBSewDqqTBAbqOU3sFsUkBXHH1IL/tAQG57iXpCmDFAmxFUsbm4DEABn7Y1LEBBQMfSaQg/9DlAF96dnCv/TkDL/zGWquMpQAJLSD6fjyVAK+7hhI+7P0CrBJgYLN5YQEOInkler0pA+NwcHLmtVEAVIGIIK89OQGYvUfyUc1VAZV7OwsqeUkB2wy851rtOQFxaZBItWlRAppKgEJNPV0BaZWcdj5hCQKOzh0X280RAcnAjArcATUB3iZ1nQ9hKQChXGHd0GydAdI0QIvRADkBs+Ma1sV4qQFTXgn2arVFAisxJ991YVECGvotCuRM5QGrXmvxvr0JAaAYdRV4kU0CJB5zrfNYwQCf4wlOeUUBAEYF0QB6ZNkDz1V+QWMtYQBqqgQuWMVhABVFaBy9/WEDdfTxGuoE/QHXiMv2NIlZATC4Ki3jESUBojqHGaeZJQJZ6r4Mk5TtAscSp0EYuQECLMwxFxGVJQGgecOC2zP0/TIR+043e6z/L8WjEGLJYQJcFetpTO1BAkTe6b9P9R0ChxX7nUsxIQErqmex4z09AJlX5nYYuVkATO17MRPY+QE+ZTQ3wGjZAqKieUOKFM0A2IwL9RWQ/QEf7ZwrpRlRA2gOd+JjFM0AHpuEyQv5XQAZDKwfKrkZAIcGD1mwYUEALqbJPRthWQP3/9OZv61hA7Iv9aidXNkDErVsQxH5QQK2JDShlP0BAQphOgEHnSkAlsAZhkAdHQH5TZ4Gm1U1A27FowdffWEDkpnh/nBFCQNIe3CgIyVZAMSzAKTOUV0D3jGCph6pXQMsGYSAdJlJA8h+Kml3qSUCST4cd3/FLQKan9PM8REVA0d5Od8w0QkDK+Sap2xkzQN8UfLCiOlRArKL3V+jJRkBRzkUP9PgLQE5/XU8k4k5AND5WDx9YUECWm5Wo9sNLQEAoAg4VaVRAdIlMTFjb7D/uXigGEzFKQJuoO/e3g0xAXFxCEPC9SUBR4XsF9BZYQGGu8nMszj1AxPNjV7cxSUCVcQxq86xPQFwlfx8uU0hAvf3HIk8rM0Ar/5cxWERTQAKHna74fVZAHJMydhu/U0AMzzpM6ClMQLmczPGPgVFAV7Zb2taTU0AyiLnCDjdTQDJlqcd+DlJAy5sYS8MlPkCsP4wruClYQLr+73KnhVFAJh2imrfzKUBceEOcWGD/P3rbsanFlRNAkoJ/peTCTEA53ziOSw5UQEGRcn4ntkBApiv6KuKUWEAoG8TBYwRTQAg8KuvCDUtAUbKcqi1IUECitZAiF5lOQH6n6DXxMzhAqP+929brUkCK8NHRZ8FRQFMtLml99VJA0N6QFl69LUDEiA+T61NUQDJ6tfJOWU9AMuaG8G2oTkCk/14kN8NLQM9Ue5NEf0tA+OiKUA5IMEA6jn5h6AkxQDay0RhfiDFAwANrs/G3SUBWJ0LmYl9HQGxWzDu16FBAXpsh10QxV0AuKWiGXPxBQOEnbk3PKUNAiZ9WOETGSUANrKDkSC9SQCzBUeGGHTRAtrYG4FclG0BnFZZ90ndLQBAr4L5zTUNAmYrCMCdOSUBf22WekrIxQLuuRNPd01JAKXloc5XsRUC85Aqvv0FXQF0YPVPTeEdAb1j4nPE6LEBoawdbmLL1PzrtDdZf0VJA7kT2BrMGQ0DZ/mU3piNHQKYW2urEN1RAGBGhmR1mKkAr4XB2VRFYQAjnIbRiEz5Ah01lSq+kU0BlUV2zq+lCQEDQLh7nSiBA3FUVD8OIUEDY6C34n4JXQDpy1gCjAVNAuJo+q7yHWEAiXlwWyiJSQOGwlnLHaUhAsmn/DemaR0BEsIOSbatFQM1B8mjrd1RARn99e0y4RUDhDHqPmqdUQBpagS/eiVBAFjScOoGnTEAgnsWItoNRQDoN3rM06VdAbO4rzvGiQ0Bn+R9yRA81QBXcV7D+kUZAPDq+K438TUCZIEGfLpJEQPo4klxbwBBAzTEZvkKXMUDf9WQvaqFLQCDpa3xQkgJACDpO5oZDKkB0sgVD2VtGQNisbNHMI0VA+A5uAfIxUkDw4pKMVQFJQJOMSCqQwVNANUhQk19kVUA0d03wEmNLQNsIprDs+kJA0ULPp9aJIECaqxFFmUU6QM808R8RiENAG48PoKYJVUDnoDls/M1VQN+wbGd+MiJAjQsQmgMTWEBNmLYwFv1RQLkJ2sCC/1JAGywvocJJQUBPEdXap4FHQHvLuCPJr1hA0jLATtZKG0CHsnIbpdRMQFek0aArSBRAh6wTWAqxRkABx04lflRKQBrM46y7DyBA7YfqHTWFCEDSOXKeu4dLQIqeqOhv20RAj4GTq2bcTUBOtsOLMuJIQIcLstlBa0JAfS270EIEUEDp1JLN6eFCQCbCknEVJSxAGudu5C5AQUBhaupBAG8vQAsE1jKcelBAo5uuaWarQUDgoJQEKN4rQCLLna8vFFZAnqrL+2taSkAYdugAPrZUQAMjsv16EhVAIDiEjsoJTEDqSrsODzBLQGZtWUSpPS5A3KZSrEuVVkDYFXfR5WYaQP+WBOpHWEpAjfzdMsuvRUDyFON9xPoZQNmCdUsa8k5ALJDISvSQVkCkvQmWzLcPQCPbUTZcv0BAiqQ0AGMVUUAE2bWubXg4QCZRsbPaYEhA/nazZrBNPkCEHeUpeV9TQLlTZU8T5UtAd/CtJRl/SECLTz/Br7ZRQFegdIp5jg9AzszKjs0cMUBtVKvb8ShWQNkaAb0zAFJA9TuYtt0zUUC6krPx3uNYQCPd4S1NAFZA45c+eMsiPEDx46PV6VtLQBqi3fZGwUpAuKopgG8WWECCA5R/EnBIQFiGnKTUX1JAh0PppkUIS0B3B7tEK4BPQPnY9ud9g1VAX7weZA/zS0CuInKSpkAUQMiPZ6xs7lNAYQMM0SfIV0BaV5iUthZBQJurB6Cc+jpA1pdZNMmpU0BMP0V2F4BRQP+52NfrAwpAzgswfMGoVkCcRBwKMKRQQJhTUqPj0lNA1hhaXFVKRkA68aXVlighQPH5JsYUmEdAJTIvvQP0S0C1ao0jKrxGQCw6vRk/nUZA8CTnjBzDPUDUYIlaPGEhQMP+7tmC9lJA8CtUbmRaQ0AbXvCoJ600QI1HnmgzI1NAlEE/qWacVUBQVmEJWfLGP7OELbviplZAevOV+HibNkA8qeWQ8/oJQLrV6jx7uEdAI1rkFAxlSUDDJXhhhxVUQFOChbRUhEZAcLkGtaczIkCG9+VaiUodQPOId53YoURAyrk/wz/8SEBrgoYsYY8/QHRwT4D4sVhA29JLbF4EPEACrF1LFfVWQIb43bZm+QhA5nfYlQK/RkC3Fftt4khNQL8Qm923pFdA6kHDUxbVU0BsIK32WRdPQEDUV2ENbjdAhv3k2zSuRkDaBxGnD942QCpY5O42iURAwLzBUxooHkDXFu3IcjFXQOzcGK1671ZAT4KX+nGYU0BnhHfkcYE8QAwzAWWNXktAEbqQ4ctrB0At0Te2HqtJQGbSKsTdjlhArPL26rK6PEBDul7nUg9BQHPFy+V6dFJAOzxr9sKvQUAdbocSaWxXQNGpIhqn2VNApzaYdz6nI0DtFPTs5RRMQLoRIgliy0JA2iYQRIgNVUC3kJi0tvNVQPs72HVwWVNAJnhJzZBUVUC7UFS7UJRYQPGlK103X05ASXDCzKqLUEAZ3LX67ccXQFBEfiBMC1RAnld6ZIEDTkAPJx9J/Tw4QAJIKgkoX1BAFQROGmxVU0CtLxF/IMtLQIQ3aJy5zytAkxjfOwujVkD3QRxcid8SQNw/om7QJkxAQK1A0p9eJUCbEoLppZ1GQL4wN2fh/kpAOBW4bvW8NUBlnshigrNRQItD5WXCYyZA0eYpAyPCV0AJFyprQmhDQJ5hH+OdaVVAI9aCV3OrRUBV3LqXDIs/QFr2E+RZOz1A7MHMzV76PUA06pP3zMA9QCA3u2Z2BUJAfb/6F1ZHRUDsfaPm/MxTQJgRao0zfUNASfIZ+D/tOEDgMpopnLceQJdgVkxMSC1AHNUpnSyWQUCx2XUItWlQQO9+ZPeM+jZARufehuRAUUB5h1IiLqBBQGNIRe1AQEhAIW54dW9YEECAN2wkcO1RQPQqUoeZGVVArUTH10fXRkBCeRaASxY8QBOHawQHpT1AvkK7dpy7K0DBS1qNW0hLQMhqSqj4dUZAla60ppe1GEAIpiFP2lMCQND2ay7RjTZAUYL4xSZNPEC8OZmYgJkiQPibOBqYLjBAvVBwX/ERNEBelPiJH0FXQHQuAcyHiFdAt8mRHWm6UUDqOajI4qtAQLj0o+Y0Jfk/3UiWEuSLJkCW6QnJw7FKQHdpDh4ZXUVA/nE8ZFbWB0DIajUlIKI8QGF0AVjwwlNACSg41vn2M0BBH/b8g1AwQKnuEglvaBVAwTY9ZXs1QEA/9HjjtI4wQBeWTmAFt0pAMqgpwY45Q0D4tVFAkSRDQIyFdcsaeVdAWOrWEoB7TkBAYFAQFTdEQPpNkzX5djdAgm3thtI9NkCSJptBNgNVQECoHnCk71ZASCChmxZsVEDwfKPfAnUhQBN6UCAPk09AWBfyEq2xSUDt/9dRlq1MQPWqfOoRZU5AFtsbWacwSEBDxLMW8mREQAOG0IlxNFZAIE5h/oR+O0ARfbdgDE0vQDp6YfJpBFZAeZifsuy0S0DBU8tEIjdTQNi8CW4/3FJAkisfTaaoQkDbVES1x6RXQB9zrLjkU0FAImK87ZFeNUBgaCVgcmk1QK4F84usSURAPRGHOC8FWECB0y4wpZFXQHgAo2kZikdA4r7ZjKNCVkB6sprFTdEmQBF43wCiMklAiI5uvO+GSUCNXq+JHa1LQF8NAjar4kBA1az19DKKVEAiuFLG8F4zQPRKabf+A05AkIuENkr4SkBYjeHDagM0QE+/g73lwzlAfMV2ZraNVkD9/++tZrAgQMIrgme+BkhAj8A2ZSzqO0BcIG6DyqBHQLIK0HEEARpAbU7EwDSIL0DpKXYpcfswQNqMuQntgSZAwqOcYNHjV0BPfBut3lpLQAiQklQZZUFA8zfk3tVSVECI0CJgepXUPyYB8vHFakJAQpQ7JutUQkA6B//trTJCQBbneev86UtAgigZZwLDUUAWAHEJfLRQQK2PojNYUVhAxcEDtvSJT0AGKlG1da1YQKSwcLbCwQhANNE0jC6yKUC3rkS+hbtQQHZlkH6jYBRACBII1aHcVEDmmFiUvAtVQKoUGXonGUJAQGQLsDHPxz9C7Art2MY4QGmi1lAnwUFA4im9nNiWVUCpnfGZnU47QIBjD11jaE5AhHw0c7FtV0BSI0eT/FRQQIRfZ7DgDk9Afre4lnMRTEAu05Vc5jZVQLMw3ZNGMUVAyp1skEDtAkCJQjbUnKNPQLNPyKbKb1hAbhQFZXq8UkCyx0boOzMqQMqHk2Cj4FBAaqgktPpMU0COpcA8DQ9OQAAhVuHgijRAdCQmVPYbNUAYsWg3qbo9QEuOuJVo11FAQB6gapZpNUCLUOrxVPc8QEYmVtzPWEtATVh3laUXIkBLzq2TufNYQBJIqh+t7jlAR1r/k9sFWEB8iDjN01xUQFdYUZrYAjVA+BRQB5teUkBPUQcuh5oyQBjDJrsPYEdA8P2OK0/URkCY1V3QsE4/QFHtrfM751JAjpeWrQgHUEAg/ANmojIkQCYkYthFrzZAJR6WLPUXVkAiPa6w4ecDQOC2rxX8nBdASG4zcrjaUEAwPRjnf1pVQHWJemy6dkhAnaBG9BtFNkA4CFD7in8qQKRMZWMbEktAF/lWmvZ1VkAcpkBI0yw/QBsYQgXtgUNACVv2o6C9V0BGXu0NU9xSQLb2gqxy+z1AarT0X4z7OEBsA7RdvcEpQHdE5OpPplRAUP+K9ju3NED2PiGKrNZBQEgwLeCoXEhAKZxo/iB7Q0BKT+sERMRTQFRDs5TfeS9ADOqLAsEtG0D7iZzaDZBXQCG3/5ZreTFAzJE5P9ySVEATi687oXlLQAMfKLWjNVRACx9YIM28QEDKCD9qVgolQMCF9cbJ2FNAgVeAL6dMREBH/5aVrGxFQMNIPcX6uEhAK1+yRPgASkBGqQq3EXFYQB2BCGjYu0pAN+0oTZXbUkAQBJOod4dXQDW6Jd8kl1VAvZvWvZ6QR0CxlpBGTLlHQI9bbuKKQTdAIAhY7l4S4T/HlwbqIIVSQNvBwm863VJAENLC+RQcFEA1eonnkpJDQAFq1/Xb4UpAIYHvLxdZU0CzzuVlo1w4QMBopI2hDlFA5tZZ3nySPUARivsW7SFOQKqPvnJSt1BAIdcJ67m2NUAVcI3XVTdLQGRisaF7FUxA+jNXKFFY8j+uPRfVPKhVQM9mJruUoQFAVxY4kmZVVkBjhsPmFr9WQM5kHm8L5jNAfE8txbDYREAtqBh/GGVRQFhVdVNI305AMh37GfEoIUCg2ckVwXEqQGBqqV0iTTJAEayR3immWECfqNIcEj9GQEr1+g0VslBAZ7InVcEKSUBzQYhzMXJNQEWUUdYUZSdAvgL3/Q+eTUBsmYmmME1NQGv/9m79A0JAdEWFCh3iPEC5+VVG0N1HQJQl/TyJcUNAudOpHv4RSUBdZELSV95DQELajNJJJCVAEXOSICwuVkC5xA880lFMQA3bJGrv0FhAjQFPEsZ3UEDEbhnIeNtDQMeFg1ELLTBAzFiftZjlP0AfPx9+7p1YQFsuPeG3+hhALVm4sbyUOEC+vp0TOp73P+/JbIQsIFFAlfmDN19WUECYUtfRZc1XQJHP/D+yiytAvirxXipQNkDRtGsrG09BQKK1wXW2vDdAFSwoOtXwSUDTsKqAA/dVQLOGloQrpFFAd0HKe/RiUkDmlJAtZbhLQPzw0EGpAOo/H1iUEdetVkBfvU0si4hAQHNdkdOSRTFA5dHpgd/fUUAkxT5JdjpXQB4ZwMAG6SNA1NCXR/0aVkCziyRH4HRUQEYT0fPcEjlAsQqSNobOUkCfWbUFN3U/QMK0QoytGvU/Jeyp26ETWECgpVDFKvhAQD48ROhUwzBASUv6AImdVUARnu1AXc0QQIWxdsKt5DVAhe89NGXlT0AZTUhCJaQsQKlVSTVKe0tAPCB9lSQDUkDgwVSHFLhQQHf0dN28BT1ARJ0NAgcWU0BpUp+HMQ85QPpaIFWfFUZARcDCTfc/UUAiD7SDlUhVQHer0Rni1TlALzMZ4zl5QUADvjcJyvFRQIVaFHiWd1VAXqBQ/W5lGEDN2HQrgQRSQL/GOwTUeVdAnghvkFg5I0DecqwCQlFVQE4QsRP3205AkmTbs0XjUkDGZjA8xp5UQEeeuaEEdEpAI50WDlbKUkAT0to1ZL1BQJ9qTr2ReElAlrDVDjwtV0D1RusHYzc3QEqLMYBNmlZAJRLLD9juV0D6HpgwDyNMQBj+WE0eLlFA/ouxPglcNUDdiq8yqSNCQAJ0kNppsTRA9fLY5fCUWEBMcgl6qZMcQIpG8q3NvU1A2PeItM+S4j/7teLpUghXQKBA6p0BwCZA9lhRzYxbUECuDP4Jj+5YQNrn/JACok1AIk1GNmAbQEDMcIbJSfb+P7kNIlZpEUVAq+PeCr+yUEBfmkMOFK8oQHXEi1MCFFJAmLeXATJ9M0Ay1sUZ3vhQQI+iMv4tYFFAMwGAXG51VEAVSa30D/ssQK0EgLj61UBA2lwpn5BzMkBr1eSGdhZCQA3ufwp/J1JAiJsiUzqzR0Dbh/37bTY0QDNCdwEzFVhAyq9wqONbRkAqDXbcpa1IQDidKQ3nUxBATveG6ClhRUDgO5sNal1YQI0f0HJrJT1ARTyrhK59UkCLmXT4gV1BQClgmajIHTJAay11YtMIU0DQGHoxP1JOQM8Ez84NHVFA/MfV87BBUEA+ry5LeCNTQDyH9zoD/x5AVKTAf3ScPEB6y3uDEKhSQAUXgIbGTRRA0C3TloIENEAeUf2pj65QQAte89RiqEZAOZtsKFvEUUA+02svNf1RQMR0Fp9HKEJAHDq+tEuSUEAEYUGx9bFYQDPlOgkTyj9AtMdcVyfUU0D/6l4nLp5UQP9XfMmq/yxAfyy+ZJs8WEBqxLXOGxVHQELR/AmkLCdAXddYULFtO0BM0hyorAhMQFmI461dDzBAM/Ark0e7RUCN4aaMB75DQOr7B9NXT/U/qDzUHanWOUCVh/ySekJSQIo5da4H0S5AawZZZtl9IkCEwHYxPokkQBvlXzy4S09A2BNK9y2KO0BqmTi7aCBSQCeaKcoIpDhAbB5Hj00mRUCN6wHrCB1RQDoeyBFl+DFApl3E/tGhU0ANb0LjXJdHQMD1is778Nc/qkP2+ciHUEBKegUxnVxQQE+2yqRS801A/oA3vZSVVECj8VFqyzoCQJEaqjkYWVhAcwF6ZCMvTkCKH4OQ+MrwP0p4aeR421hAAF696r1tUEB0QDkzPTpMQG75aGTTmTxA3M5NSHH25T82j2/OXx8yQLrRa9N1X0NATOjl/AC3U0ADRD2zE7ZSQM3yTxbs3SNA+B/eSg9iTEAXBDz3kZYwQGuwvkyONkRA0cob8JkrWEClmTZ3pwJUQK8l1Ev4BFNAnfl9HmZZUkDDjwm1Tgk9QCYiQ8m1ADdAh+cWQvA8VUBVk8bRCAc+QA7dNjhkLFNAqmaNy1uoVkBMDu47v+pRQEtQSWz3iVNACbl7EsKGUUAGgb7hEgk9QPLMvu5kQDpAOrtIVV35OUAEVJolk1Q2QBoDqwizRjBABczMuREaREDseejk2+9SQME2h2A2cFBAz7HYzLAuVUBDDEWtbSs/QPXfCXsWYkZAIZ9nF7/fV0C2heFIqTBBQID8AkiowElAuINY6cl9KECZnJknrvUyQKuSCR53OlRAXzwzkoTHV0B2Wodvt4hSQGLdwqK+e1BAnq+uisGcU0A/wDGnDWRSQKTGQEIpX1hA3fGLsxxBO0AkM8qwi1dLQFc6gazsF1dAw4fro2aNQkBzlMr8sJgUQMlcjRwzZklA9mCQumzcLEAoojCyaixVQJnuxl5gXkZAH04wAsoiTUDE7N4s6xJRQEnzK48MkTFAeIvBmSZURUC+0e0DrwlOQBzRgzmEykJAtpNUSBhEUkBHZCqiRlc9QClxaOf5aSZA3b//fH5mR0DVXJaRQMFQQFLBT8RxKVZAR9VvrH7pUkCJ93FfSWVUQKbk/otKclBAqotaJvs/JEB+B7NgnxxNQD6p/B9eQ01A8Ybtq1dbGEDT/NM12u1RQOLQih7gATNA+0kkuD5hREBFul9HqNY/QJd+OEpyB0NAbiUhm3l1SECSgf24MpdSQB+t7yNayE5AHly8bVmNUEDNFRwEllAvQMkVDXjC5w5Ah+bs8p6yUUBPXf56w8xYQLq0tYeIZ0FAkSlvyMq1U0B1LQiFpQ1QQMR/9CX83lZAV74//pk0NEBSB8HatQIsQO0FeNx+gEhAohwblLpAR0CgHeqPaCjePyfckWUht1JAGgqyEhbbUEDn18dPRRhPQL6cLkbJtDlArrDuFxQjNUB05yfo/r9OQHI2U08Zm1FAF62ebNfNUEAxLRYsbDAIQDwHvGvJK0dA9nYOaBRkIkBK7NG5dJEUQMhegqH1z0lAL+GVmVDaREDp0UGfoio4QOB9S+y/+TtAMlwk1OKeVUAuWzNbfnAUQEjRfrRAxEBAZ8ApJKUpSkB6sSi774lIQLpdCj2PmFhAEFnJ24J82j+b+Ct4hOpWQF66JOw+CCNA2kIllz3TS0CgfUdXRgpEQD7Y4x3ieFZAF4Z8eYwIQ0BEJpqfYxJWQHMyP3VuH0RAMkfR6+QRQkB72yT3m6EsQD9yFbQ82ktA6AnzoQxr2j95hOzSWCxYQJayeowCpUxAKHFrU6TvWECWt3UKe/dKQNgE7SBVOjRAURcR3FiLUUBSGjzFJec1QIrI1Xf7WR5Acg/XqF4nL0BkXPFg3WNNQHKs2vJx1lJAwnguap95LkAeg7QNCvYwQOttFmU/pVhAf7tFgTBLP0CvcCa/m05XQKa76zLl4lRATovq1HtsWEDAe3Eh1lc6QKFwz8Jm0C5AGlljdyiHSEDurp7BON1CQPQEjLREAk5AEHUiKxJJQECmlh6cW5gWQAg0lkMl40xAORZQxfrQQUCwh7mh66hCQP7iROgHSEJAlI6JLX6YU0DH7gNFzLZWQFn/B89A9khAvxLIlYFqVkDvOV9JatlXQC52DBLMKk9AkMc/wyToUkBbMC57DJc5QNGXgzCHYldApb4Dn5mdVED6a/cs3LhXQDj0QA0qJ1RA/j+cRnvcV0DhUEhI6K06QGj4SWN121JAmuSIlr7ASkDgLtYmhZcmQImUoHfr9klACjURAuJBWEA6qHOuO3dJQE8tWkRsIDNAPHlBZ7t9RUC6PN/yR+VVQNhqN4y3Z0tA7nEubg0sUkD8dwzKPMMhQJoMF99g3zNA7f3gW7dxWEDsPRistVcYQDCJwn+5eT5AcZL3mh+9PUBwnncQ6/JTQP1h7+ABXUZAYivNm4oHUUCo6ecpAXZSQGxHeRO/JzxAenW1qBwyUkBI+cJmheE4QG+5IBYJUkpAl5jua/drUECDYuqpANBMQLJ/ddVcE1JAhM6OsqFW7j/Gfag+XelVQPmey2MpT0xANDYVl9L3QkCtk9rTRvc3QBpGE6B1dFZAYOyv0H92S0DMBMlyw+9CQFC1eUxZFiBAigBdpedwREDy7sNZmABBQJQiC9cAhxFAtJIy32f/U0AeAC1T4RohQPEzTfA9F0ZA4w/AdE94V0BHS3h9FyZGQMA4RiKvZPI/O/ecnQwxDkDC95L1o85CQPqoZ939aUdAOJ/HbuKEU0CUqqQTpQk3QF/GXfLNZjtAU8y9wNRER0AyukQBu9JXQD2zpMWxVCFAVb9M9CtRV0BRxtamdxdAQPowO2l75UhA2MaPcnFqQkBP3/UAcnxUQMo1TyMgWU1A1KdPwl2zOEDY4hQy1dNVQLpzOGWSolBAXYfy53qRRUBEknNAGiIbQKKIN6Rp9VNAYN9j4UUsSUCGERbXxOpUQGQbXULwNhFAbX903UpFOUAALCBQJLA6QPmbhdCuaVVAcN+axr/MRUAfOt5GOyRQQOYkxH4h3FNA0lAdpj/zU0DEeZzJ5BwtQFOQAjfJKypA4HgTEcYkGEAulmRCTwtIQLiXGJyzU1BA4ndNIzppQ0CnSCPetflWQNjmxBg0ejtAErueV+3oVUDWIsCMzypQQChOVF9fbFZAEpnvFO0ZGUC3bEbhggFWQPEOqX6sSFhA6OAJUOLO/D+senkmGaZCQNLyjGtgRytAryGGJY3QT0Aw+iPwMm1KQAL0xR7lCldAFCqztI8NTUCtdED291JRQLC2VijHzEJA7Aj+nBj4VUC2ygWuH5xWQAD4l96EsUNAKYI884EfSUBFIg+te89QQFohpK52FCRA+MXJ9AcGP0CugNAb7/VCQCGiywcYQlVA8q3+wHr9V0DY8gDkQJVWQNKcUlv6MgBAh3ThTshRTUDWqv38AmVYQEWHKK5LOVdAEcfhXuKoUUDbP+7/RjtFQIDz/1d5GfU/Y7ZzN64zS0BQR+zbbTVDQDkeZngx0DtA5IMmq5V3OUD1kHxfUQk6QNMxLFLn3EJA3gu8KYzhVkAl4LoCcqQjQOLAD3tT2DJAcY0PMYnjT0BJP5pp/AEGQFDwOJn3A0RATplXnrsmVEANGKRRz9NSQHk+Qtbi7zlAf8f8SqoUAkAi9VywpShFQNgTalbc4jZAaqVmBJUyMkDYOMozp1VTQCiQIBu9YxpAirIPeO6ON0CQqDO8sqlYQLyXQeiHPk1AOW0wEcWsUUD9MS5zaN1JQN7OKbYkF0tAlCty3LuiLEDby4zYT8ZVQLRrQb7A60RAu2GbbrWVN0AXB0k25ME6QOmQR8B2QUFAiQTcwXyUV0AxOzHnzlNWQCEwCc+3EzlAAhwvsEAGQUCVRPrf2hxSQLAMkqaKm9s/J26je8XPMUDOADj9DNZWQLnVr/sDV05AL9p+ZVM4WEDf8XtMYk5XQB2scZRvDk5AMkJJkkb9S0Bxy24cuItRQHAfNi3RSitAOFpgSzrLRkBBErsD3aQ1QLDqZQCYLUFAWpzIIPbTV0BPC6lckaw1QE6UNJvVZ1BALhvtRqwi+D9/cQHJaMJFQBN0pWXk20hAL3D8l9NeLUDudVfdNGw/QEqrSqimAFVAiw8zbKCBUEBOQPOwZQhJQAvwq3tcgExAwNwJwv1KUkAS88Ce9QATQCoPw3xEpUtAaoW6KV4+VEBrpbu/dqxUQKAws5BcCFFAFBZ8X/qJUEBs8qc6jNBJQPQwyPBJOEpAjqvOWly9MED/+LVQA94mQPxhj4hziFBAlMGeQaIVLEA1Re4iCN5QQLQyHIaNCz5An/rqyFx6NkBTSTHMYeNGQHlAALKHAVBA+dgnFa6nSEBtzXKCqiZUQATy3QXrJUhAFotaYKpoSUAytVoLyKlXQA==\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[2000]}},\"selected\":{\"id\":\"2411\"},\"selection_policy\":{\"id\":\"2410\"}},\"id\":\"2296\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"2280\",\"type\":\"LinearScale\"},{\"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\":\"2299\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"2405\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"2282\",\"type\":\"LinearScale\"},{\"attributes\":{\"source\":{\"id\":\"2296\"}},\"id\":\"2301\",\"type\":\"CDSView\"},{\"attributes\":{\"children\":[{\"id\":\"2275\"},{\"id\":\"2302\"}]},\"id\":\"2304\",\"type\":\"Row\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"2408\"},\"group\":null,\"major_label_policy\":{\"id\":\"2409\"},\"ticker\":{\"id\":\"2285\"}},\"id\":\"2284\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"2411\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"2409\",\"type\":\"AllLabels\"},{\"attributes\":{\"coordinates\":null,\"group\":null},\"id\":\"2402\",\"type\":\"Title\"},{\"attributes\":{\"axis\":{\"id\":\"2284\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"2287\",\"type\":\"Grid\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.6},\"fill_color\":{\"value\":\"#1f77b4\"},\"line_color\":{\"value\":null},\"radius\":{\"value\":1},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2297\",\"type\":\"Circle\"},{\"attributes\":{\"args\":{\"div\":{\"id\":\"2302\"}},\"code\":\"\\ndiv.text = \\\"Button!\\\";\\n\"},\"id\":\"2306\",\"type\":\"CustomJS\"},{\"attributes\":{},\"id\":\"2289\",\"type\":\"BasicTicker\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"2405\"},\"group\":null,\"major_label_policy\":{\"id\":\"2406\"},\"ticker\":{\"id\":\"2289\"}},\"id\":\"2288\",\"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\":\"2298\",\"type\":\"Circle\"}],\"root_ids\":[\"2305\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n",
1068
+ " const render_items = [{\"docid\":\"98bde7b0-f3df-4fad-9c82-3b265eba6b4f\",\"root_ids\":[\"2305\"],\"roots\":{\"2305\":\"ead7aa65-c9d0-445b-b7ce-d451a59774a7\"}}];\n",
1069
+ " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
1070
+ " }\n",
1071
+ " if (root.Bokeh !== undefined) {\n",
1072
+ " embed_document(root);\n",
1073
+ " } else {\n",
1074
+ " let attempts = 0;\n",
1075
+ " const timer = setInterval(function(root) {\n",
1076
+ " if (root.Bokeh !== undefined) {\n",
1077
+ " clearInterval(timer);\n",
1078
+ " embed_document(root);\n",
1079
+ " } else {\n",
1080
+ " attempts++;\n",
1081
+ " if (attempts > 100) {\n",
1082
+ " clearInterval(timer);\n",
1083
+ " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
1084
+ " }\n",
1085
+ " }\n",
1086
+ " }, 10, root)\n",
1087
+ " }\n",
1088
+ "})(window);"
1089
+ ],
1090
+ "application/vnd.bokehjs_exec.v0+json": ""
1091
+ },
1092
+ "metadata": {
1093
+ "application/vnd.bokehjs_exec.v0+json": {
1094
+ "id": "2305"
1095
+ }
1096
+ },
1097
+ "output_type": "display_data"
1098
+ }
1099
+ ],
1100
+ "source": [
1101
+ "from bokeh.plotting import figure\n",
1102
+ "from bokeh import events\n",
1103
+ "from bokeh.models import CustomJS, Div, Button\n",
1104
+ "from bokeh.layouts import column, row\n",
1105
+ "\n",
1106
+ "import numpy as np\n",
1107
+ "x = np.random.random(size=2000) * 100\n",
1108
+ "y = np.random.random(size=2000) * 100\n",
1109
+ "\n",
1110
+ "p = figure(tools=\"box_select\")\n",
1111
+ "p.scatter(x, y, radius=1, fill_alpha=0.6, line_color=None)\n",
1112
+ "\n",
1113
+ "div = Div(width=400)\n",
1114
+ "button = Button(label=\"Button\", width=300)\n",
1115
+ "layout = column(button, row(p, div))\n",
1116
+ "\n",
1117
+ "# Events with no attributes\n",
1118
+ "button.js_on_event(events.ButtonClick, CustomJS(args=dict(div=div), code=\"\"\"\n",
1119
+ "div.text = \"Button!\";\n",
1120
+ "\"\"\")) \n",
1121
+ "\n",
1122
+ "p.js_on_event(events.SelectionGeometry, CustomJS(args=dict(div=div), code=\"\"\"\n",
1123
+ "div.text = \"Selection! <p> <p>\" + JSON.stringify(cb_obj.geometry, undefined, 2);\n",
1124
+ "\"\"\"))\n",
1125
+ "\n",
1126
+ "show(layout)"
1127
+ ]
1128
+ },
1129
+ {
1130
+ "cell_type": "code",
1131
+ "execution_count": 15,
1132
+ "metadata": {},
1133
+ "outputs": [],
1134
+ "source": [
1135
+ "# Exercise: Create a plot that responds to different events from bokeh.events\n",
1136
+ "\n"
1137
+ ]
1138
+ },
1139
+ {
1140
+ "cell_type": "markdown",
1141
+ "metadata": {},
1142
+ "source": [
1143
+ "## Additional Information\n",
1144
+ "\n",
1145
+ "There are many kinds of interactions and events that can be connected to `CustomJS` callbacks. \n",
1146
+ "\n",
1147
+ "\n",
1148
+ "* Widgets - Button, Toggle, Dropdown, TextInput, AutocompleteInput, Select, Multiselect, Slider, (DateRangeSlider), DatePicker,\n",
1149
+ "* Tools - TapTool, BoxSelectTool, HoverTool,\n",
1150
+ "* Selection - ColumnDataSource, AjaxDataSource, BlazeDataSource, ServerDataSource\n",
1151
+ "* Ranges - Range1d, DataRange1d, FactorRange\n",
1152
+ "\n",
1153
+ "\n",
1154
+ "For more complete examples the User Guide section on [JavaScript Interactions](https://bokeh.pydata.org/en/latest/docs/user_guide/interaction.html)"
1155
+ ]
1156
+ },
1157
+ {
1158
+ "cell_type": "markdown",
1159
+ "metadata": {},
1160
+ "source": [
1161
+ "# Next Section"
1162
+ ]
1163
+ },
1164
+ {
1165
+ "cell_type": "markdown",
1166
+ "metadata": {},
1167
+ "source": [
1168
+ "Click on this link to go to the next notebook: [07 - Bar and Categorical Data Plots](07%20-%20Bar%20and%20Categorical%20Data%20Plots.ipynb).\n",
1169
+ "\n",
1170
+ "To go back to the overview, click [here](00%20-%20Introduction%20and%20Setup.ipynb)."
1171
+ ]
1172
+ }
1173
+ ],
1174
+ "metadata": {
1175
+ "anaconda-cloud": {},
1176
+ "kernelspec": {
1177
+ "display_name": "Python 3",
1178
+ "language": "python",
1179
+ "name": "python3"
1180
+ },
1181
+ "language_info": {
1182
+ "codemirror_mode": {
1183
+ "name": "ipython",
1184
+ "version": 3
1185
+ },
1186
+ "file_extension": ".py",
1187
+ "mimetype": "text/x-python",
1188
+ "name": "python",
1189
+ "nbconvert_exporter": "python",
1190
+ "pygments_lexer": "ipython3",
1191
+ "version": "3.7.9"
1192
+ }
1193
+ },
1194
+ "nbformat": 4,
1195
+ "nbformat_minor": 4
1196
+ }