j1-template 2022.5.0.rc1 → 2022.5.0.rc4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (378) hide show
  1. checksums.yaml +4 -4
  2. data/assets/data/banner.html +24 -1
  3. data/assets/themes/j1/adapter/js/masterslider.js +22 -5
  4. data/assets/themes/j1/core/css/themes/unolight/bootstrap.css +56 -0
  5. data/assets/themes/j1/core/css/themes/unolight/bootstrap.min.css +1 -1
  6. data/lib/j1/version.rb +1 -1
  7. data/lib/starter_web/Gemfile +270 -270
  8. data/lib/starter_web/_config.yml +19 -9
  9. data/lib/starter_web/_data/blocks/banner.yml +17 -0
  10. data/lib/starter_web/_data/modules/defaults/masterslider.yml +1 -1
  11. data/lib/starter_web/_data/modules/justifiedGallery.yml +82 -0
  12. data/lib/starter_web/_data/modules/masterslider.yml +5 -9
  13. data/lib/starter_web/_data/modules/navigator_menu.yml +208 -168
  14. data/lib/starter_web/_includes/attributes.asciidoc +18 -14
  15. data/lib/starter_web/_includes/tables/template_variables.asciidoc +1 -1
  16. data/lib/starter_web/_plugins/asciidoctor-extensions/lightbox-block.rb +4 -4
  17. data/lib/starter_web/assets/images/pages/features/blog-post-navigator-1280x1000.jpg +0 -0
  18. data/lib/starter_web/assets/images/pages/features/bootswatch-themes-1280x800.png +0 -0
  19. data/lib/starter_web/assets/images/pages/features/clipboard-1280x600.jpg +0 -0
  20. data/lib/starter_web/assets/images/pages/features/comments-1280x600.jpg +0 -0
  21. data/lib/starter_web/assets/images/pages/features/cookie-consent-1280x800.jpg +0 -0
  22. data/lib/starter_web/assets/images/pages/features/desktop-web-navigation-1280x1000.jpg +0 -0
  23. data/lib/starter_web/assets/images/pages/features/example-content-1280x800.jpg +0 -0
  24. data/lib/starter_web/assets/images/pages/features/example-content-present-videos-1280x800.jpg +0 -0
  25. data/lib/starter_web/assets/images/pages/features/fab-1280x500.jpg +0 -0
  26. data/lib/starter_web/assets/images/pages/features/full-text-search-1280x800.jpg +0 -0
  27. data/lib/starter_web/assets/images/pages/features/global-mobile-traffic-1920x1080.png +0 -0
  28. data/lib/starter_web/assets/images/pages/features/google-lighthouse-1080x300.png +0 -0
  29. data/lib/starter_web/assets/images/pages/features/intro-panel-1280x800.jpg +0 -0
  30. data/lib/starter_web/assets/images/pages/features/master-header-1280x600.jpg +0 -0
  31. data/lib/starter_web/assets/images/pages/features/mobile-navigation-600x800.png +0 -0
  32. data/lib/starter_web/assets/images/pages/features/native-speakers-by-language.png +0 -0
  33. data/lib/starter_web/assets/images/pages/features/nav-module-1280x300.jpg +0 -0
  34. data/lib/starter_web/assets/images/pages/features/nbi-barchart-1280x800.jpg +0 -0
  35. data/lib/starter_web/assets/images/pages/features/teaser-banner-1280x600.jpg +0 -0
  36. data/lib/starter_web/assets/images/pages/features/translator-1280x800.jpg +0 -0
  37. data/lib/starter_web/assets/images/sticker/600x600/sticker-new-version.png +0 -0
  38. data/lib/starter_web/assets/images/sticker/scalable/readme +0 -0
  39. data/lib/starter_web/package.json +6 -6
  40. data/lib/starter_web/pages/public/_jupyter/docs/_includes/attributes.asciidoc +67 -0
  41. data/lib/starter_web/pages/public/_jupyter/docs/_includes/documents/j1_docs_example_static.asciidoc +232 -0
  42. data/lib/starter_web/pages/public/_jupyter/docs/binderhub.adoc +631 -0
  43. data/lib/starter_web/pages/public/_jupyter/docs/j1-nbinteract.adoc +638 -0
  44. data/lib/starter_web/pages/public/_jupyter/docs/jupyterhub.adoc +248 -0
  45. data/lib/starter_web/pages/public/_jupyter/docs/nbinteract-widget-manual.adoc +928 -0
  46. data/lib/starter_web/pages/public/_jupyter/examples/distributed/j1-circular-times-table.adoc +139 -0
  47. data/lib/starter_web/pages/public/_jupyter/examples/distributed/j1-common-used-widgets.adoc +229 -0
  48. data/lib/starter_web/pages/public/_jupyter/examples/distributed/j1-odes-in-python.adoc +112 -0
  49. data/lib/starter_web/pages/public/_jupyter/examples/localized/j1-altair/j1-altair-visualisations.adoc +142 -0
  50. data/lib/starter_web/pages/public/_jupyter/examples/localized/j1-bokeh/j1-bokeh-visualisations.adoc +171 -0
  51. data/lib/starter_web/pages/public/_jupyter/examples/localized/j1-bokeh/j1-bqplot-eamples.adoc +111 -0
  52. data/lib/starter_web/pages/public/_jupyter/examples/localized/j1-plotly/j1-plotly-visualisations.adoc +94 -0
  53. data/lib/starter_web/pages/public/_jupyter/examples/localized/j1_climate-change-forecast.adoc +106 -0
  54. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_altair_interactive-checkpoint.ipynb +16260 -0
  55. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_bgplot_line_plot-checkpoint.ipynb +247 -0
  56. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_circular_times_table-Copy1-checkpoint.ipynb +12382 -0
  57. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_circular_times_table-checkpoint.ipynb +12387 -0
  58. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_circular_times_table-short-checkpoint.ipynb +12170 -0
  59. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_climate_change_forecast-checkpoint.ipynb +1058 -0
  60. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_docs_example_dynamic-checkpoint.ipynb +14478 -0
  61. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_interactive_widgets-Copy1-checkpoint.ipynb +379 -0
  62. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_interactive_widgets-checkpoint.ipynb +442 -0
  63. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets-checkpoint.ipynb +523 -0
  64. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets.line_charts-checkpoint.ipynb +84 -0
  65. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets.questions-checkpoint.ipynb +194 -0
  66. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_bar_chart-checkpoint.ipynb +89 -0
  67. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_bar_charts-Copy1-checkpoint.ipynb +164 -0
  68. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_bar_charts-checkpoint.ipynb +173 -0
  69. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_bar_charts.1-checkpoint.ipynb +256 -0
  70. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_barcharts-checkpoint.ipynb +126 -0
  71. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_hist_chart-checkpoint.ipynb +87 -0
  72. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_line_chart-checkpoint.ipynb +90 -0
  73. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_line_charts-checkpoint.ipynb +87 -0
  74. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_question_multiple_choice-checkpoint.ipynb +64 -0
  75. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_question_short_answer-checkpoint.ipynb +122 -0
  76. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_questions-checkpoint.ipynb +181 -0
  77. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_scatter_chart-checkpoint.ipynb +89 -0
  78. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_scatter_charts-checkpoint.ipynb +175 -0
  79. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_nbi_widgets_scatter_drag_chart-checkpoint.ipynb +87 -0
  80. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_ode_selected-checkpoint.ipynb +14478 -0
  81. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/.ipynb_checkpoints/j1_odes_in_python-checkpoint.ipynb +15227 -0
  82. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/factor_by_factor.mp4 +0 -0
  83. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_circular_times_table.ipynb +12382 -0
  84. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_climate_change_forecast.ipynb +1058 -0
  85. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_docs_example_dynamic.ipynb +14478 -0
  86. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_interactive_widgets.ipynb +442 -0
  87. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_nbi_widgets.ipynb +523 -0
  88. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_nbi_widgets_bar_chart.ipynb +89 -0
  89. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_nbi_widgets_hist_chart.ipynb +87 -0
  90. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_nbi_widgets_line_chart.ipynb +90 -0
  91. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_nbi_widgets_question_multiple_choice.ipynb +64 -0
  92. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_nbi_widgets_question_short_answer.ipynb +122 -0
  93. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_nbi_widgets_scatter_chart.ipynb +89 -0
  94. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_nbi_widgets_scatter_drag_chart.ipynb +87 -0
  95. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/j1_odes_in_python.ipynb +15227 -0
  96. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/line_by_line.mp4 +0 -0
  97. data/lib/starter_web/pages/public/_jupyter/notebooks/j1/point_by_point.mp4 +0 -0
  98. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-altair-tutorial/.ipynb_checkpoints/j1_altair_interactive-checkpoint.ipynb +16296 -0
  99. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-altair-tutorial/.ipynb_checkpoints/j1_altair_non_interactive-checkpoint.ipynb +15385 -0
  100. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-altair-tutorial/j1_altair_interactive.ipynb +16296 -0
  101. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-altair-tutorial/j1_altair_non_interactive.ipynb +15385 -0
  102. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/00 - Introduction and Setup-checkpoint.ipynb +717 -0
  103. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/01 - Basic Plotting-checkpoint.ipynb +1381 -0
  104. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/02 - Styling and Theming-checkpoint.ipynb +1440 -0
  105. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/03 - Data Sources and Transformations-checkpoint.ipynb +927 -0
  106. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/04 - Adding Annotations-checkpoint.ipynb +1105 -0
  107. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/05 - Presentation Layouts-checkpoint.ipynb +578 -0
  108. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/06 - Linking and Interactions-checkpoint.ipynb +1196 -0
  109. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/07 - Bar and Categorical Data Plots-checkpoint.ipynb +1681 -0
  110. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/08 - Graph and Network Plots-checkpoint.ipynb +680 -0
  111. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/09 - Geographic Plots-checkpoint.ipynb +693 -0
  112. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/10 - Exporting and Embedding-checkpoint.ipynb +751 -0
  113. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/11 - Running Bokeh Applications-checkpoint.ipynb +770 -0
  114. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/bokeh_tut_00_introduction_and_setup-checkpoint.ipynb +666 -0
  115. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_01_basic_plotting-checkpoint.ipynb +1365 -0
  116. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_02_styling_and_theming-checkpoint.ipynb +1405 -0
  117. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_03_data_sources_and_transformations-checkpoint.ipynb +856 -0
  118. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_04_adding_annotations-checkpoint.ipynb +1167 -0
  119. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_05_presentation_layouts-checkpoint.ipynb +601 -0
  120. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_06_linking_and_interactions-checkpoint.ipynb +1356 -0
  121. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_07_bar_and_categorical_data_plots-checkpoint.ipynb +1742 -0
  122. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_08_graph_and_network_plots-checkpoint.ipynb +625 -0
  123. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_09_geographic_plots-checkpoint.ipynb +685 -0
  124. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_10_exporting_and_embedding-checkpoint.ipynb +726 -0
  125. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_10_exporting_and_embedding-checkpoint.org +726 -0
  126. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_10_exporting_and_embedding.new-checkpoint.ipynb +560 -0
  127. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/.ipynb_checkpoints/j1_bokeh_11_running_bokeh_applications-checkpoint.ipynb +716 -0
  128. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/j1_bokeh_01_basic_plotting.ipynb +1365 -0
  129. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/j1_bokeh_02_styling_and_theming.ipynb +1405 -0
  130. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/j1_bokeh_03_data_sources_and_transformations.ipynb +856 -0
  131. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/j1_bokeh_04_adding_annotations.ipynb +1167 -0
  132. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/j1_bokeh_05_presentation_layouts.ipynb +601 -0
  133. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/j1_bokeh_06_linking_and_interactions.ipynb +1356 -0
  134. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/j1_bokeh_07_bar_and_categorical_data_plots.ipynb +1742 -0
  135. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/j1_bokeh_08_graph_and_network_plots.ipynb +625 -0
  136. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bokeh-tutorial/j1_bokeh_09_geographic_plots.ipynb +685 -0
  137. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bqplot/.ipynb_checkpoints/j1_mathplot_vs_bqplot-checkpoint.ipynb +336 -0
  138. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bqplot/advanced/Feature_Vector_Distribution-Iris-Digits.ipynb +433 -0
  139. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bqplot/j1_bgplot_line_plot.ipynb +244 -0
  140. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bqplot/j1_circular_times_table-short.ipynb +12170 -0
  141. data/lib/starter_web/pages/public/_jupyter/notebooks/j1-bqplot/j1_mathplot_vs_bqplot.ipynb +336 -0
  142. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/.ipynb_checkpoints/Index-checkpoint.ipynb +163 -0
  143. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/.ipynb_checkpoints/Tutorials-checkpoint.ipynb +51 -0
  144. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Advanced Plotting/Advanced Plotting.ipynb +289 -0
  145. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Advanced Plotting/Animations.ipynb +266 -0
  146. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Advanced Plotting/Axis Properties.ipynb +396 -0
  147. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Advanced Plotting/Plotting Dates.ipynb +318 -0
  148. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Equity Index Performance/Time Series.ipynb +158 -0
  149. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Equity Index Performance/spx_prices.csv +6799 -0
  150. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Feature_Vector_Distribution-Iris-Digits.ipynb +470 -0
  151. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Index.ipynb +49 -0
  152. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Logs Analytics/Logs Dashboard.ipynb +378 -0
  153. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Mobile Patent Suits.ipynb +123 -0
  154. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Neural Network.ipynb +177 -0
  155. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Outlier Detection.ipynb +311 -0
  156. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Wealth Of Nations/Bubble Chart.ipynb +255 -0
  157. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Wealth Of Nations/Choropleth.ipynb +275 -0
  158. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Wealth Of Nations/nations.json +1 -0
  159. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Applications/Wealth Of Nations/world_map_codes.csv +234 -0
  160. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Basic Plotting/.ipynb_checkpoints/Basic Plotting-checkpoint.ipynb +186 -0
  161. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Basic Plotting/.ipynb_checkpoints/Pyplot-checkpoint.ipynb +794 -0
  162. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Basic Plotting/.ipynb_checkpoints/Untitled-checkpoint.ipynb +323 -0
  163. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Basic Plotting/Basic Plotting.ipynb +261 -0
  164. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Basic Plotting/Pyplot.ipynb +1489 -0
  165. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Index.ipynb +163 -0
  166. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Interactions/Interaction Layer.ipynb +966 -0
  167. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Interactions/Mark Interactions.ipynb +476 -0
  168. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Interactions/Selectors.ipynb +427 -0
  169. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Introduction.ipynb +528 -0
  170. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Bars.ipynb +480 -0
  171. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Bins.ipynb +217 -0
  172. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Boxplot.ipynb +253 -0
  173. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Candles.ipynb +225 -0
  174. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/FlexLine.ipynb +123 -0
  175. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Graph.ipynb +357 -0
  176. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/GridHeatMap.ipynb +422 -0
  177. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/HeatMap.ipynb +157 -0
  178. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Hist.ipynb +176 -0
  179. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Image.ipynb +195 -0
  180. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Label.ipynb +189 -0
  181. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Lines.ipynb +565 -0
  182. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Map.ipynb +182 -0
  183. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Market Map.ipynb +315 -0
  184. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Pie.ipynb +465 -0
  185. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Object Model/Scatter.ipynb +835 -0
  186. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Bars.ipynb +362 -0
  187. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Bins.ipynb +252 -0
  188. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Boxplot.ipynb +273 -0
  189. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Candles.ipynb +242 -0
  190. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/GridHeatMap.ipynb +417 -0
  191. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/HeatMap.ipynb +155 -0
  192. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Hist.ipynb +238 -0
  193. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Image.ipynb +152 -0
  194. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Label.ipynb +206 -0
  195. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Lines.ipynb +474 -0
  196. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Map.ipynb +181 -0
  197. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Pie.ipynb +310 -0
  198. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Marks/Pyplot/Scatter.ipynb +702 -0
  199. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Scales/Color Scales.ipynb +495 -0
  200. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/.ipynb_checkpoints/Feature_Vector_Distribution-Iris-Digits-checkpoint.ipynb +433 -0
  201. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/.ipynb_checkpoints/Linking Plots With Widgets-checkpoint.ipynb +326 -0
  202. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/.ipynb_checkpoints/Updating Plots-Copy1-checkpoint.ipynb +177 -0
  203. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/.ipynb_checkpoints/Updating Plots-checkpoint.ipynb +177 -0
  204. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/Brush Interval Selector.ipynb +154 -0
  205. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/Fast Interval Selector.ipynb +152 -0
  206. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/Gaussian Density Widget.ipynb +128 -0
  207. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/Gaussian Density.ipynb +113 -0
  208. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/Linking Plots With Widgets.ipynb +326 -0
  209. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/Object Model.ipynb +179 -0
  210. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/Pyplot.ipynb +174 -0
  211. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials/Updating Plots.ipynb +177 -0
  212. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/Tutorials.ipynb +51 -0
  213. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/data_files/country_codes.csv +213 -0
  214. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/data_files/gdp_per_capita.csv +56 -0
  215. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/data_files/state_codes.csv +52 -0
  216. data/lib/starter_web/pages/public/_jupyter/notebooks/martin_renou_bqplot/data_files/trees.jpg +0 -0
  217. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/.ipynb_checkpoints/nbi_docs_examples_central_limit_theorem-checkpoint.ipynb +247 -0
  218. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/.ipynb_checkpoints/nbi_docs_examples_variability_of_the_sample_mean-checkpoint.ipynb +323 -0
  219. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/.ipynb_checkpoints/nbi_docs_recipes_graphing-checkpoint.ipynb +387 -0
  220. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/.ipynb_checkpoints/nbi_docs_recipes_interactive_questions-checkpoint.ipynb +185 -0
  221. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/.ipynb_checkpoints/nbi_docs_recipes_layout-checkpoint.ipynb +384 -0
  222. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/.ipynb_checkpoints/nbi_docs_tutorial_interact-checkpoint.ipynb +254 -0
  223. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/.ipynb_checkpoints/nbi_docs_tutorial_monty_hall-checkpoint.ipynb +732 -0
  224. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_examples_central_limit_theorem.ipynb +247 -0
  225. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_examples_correlation.ipynb +651 -0
  226. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_examples_empirical_distributions.ipynb +773 -0
  227. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_examples_linear_regression.ipynb +111 -0
  228. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_examples_probability_distribution_plots.ipynb +199 -0
  229. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_examples_sampling_from_a_population.ipynb +421 -0
  230. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_examples_variability_of_the_sample_mean.ipynb +323 -0
  231. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_recipes_graphing.ipynb +387 -0
  232. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_recipes_interactive_questions.ipynb +185 -0
  233. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_recipes_layout.ipynb +384 -0
  234. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_tutorial_interact.ipynb +254 -0
  235. data/lib/starter_web/pages/public/_jupyter/notebooks/nbi-docs/nbi_docs_tutorial_monty_hall.ipynb +732 -0
  236. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Advanced Plotting.html +373 -0
  237. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Animations.html +361 -0
  238. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Axis Properties.html +569 -0
  239. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Bars.html +487 -0
  240. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Basic Plotting.html +341 -0
  241. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Bins.html +259 -0
  242. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Boxplot.html +277 -0
  243. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Brush Interval Selector.html +182 -0
  244. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Bubble Chart.html +299 -0
  245. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Candles.html +252 -0
  246. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Choropleth.html +318 -0
  247. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Color Scales.html +514 -0
  248. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Fast Interval Selector.html +182 -0
  249. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Feature_Vector_Distribution-Iris-Digits.html +479 -0
  250. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/FlexLine.html +128 -0
  251. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Gaussian Density Widget.html +152 -0
  252. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Gaussian Density.html +137 -0
  253. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Graph.html +484 -0
  254. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/GridHeatMap.html +483 -0
  255. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/HeatMap.html +170 -0
  256. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Hist.html +349 -0
  257. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Image.html +177 -0
  258. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Index.html +29 -0
  259. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Interaction Layer.html +1372 -0
  260. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Introduction.html +749 -0
  261. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Label.html +268 -0
  262. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Lines.html +704 -0
  263. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Linking Plots With Widgets.html +389 -0
  264. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Logs Dashboard.html +455 -0
  265. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Map.html +229 -0
  266. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Mark Interactions.html +613 -0
  267. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Market Map.html +413 -0
  268. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Mobile Patent Suits.html +131 -0
  269. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Neural Network.html +190 -0
  270. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Object Model.html +193 -0
  271. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Outlier Detection.html +363 -0
  272. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Pie.html +367 -0
  273. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Plotting Dates.html +337 -0
  274. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Pyplot.html +196 -0
  275. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Scatter.html +948 -0
  276. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Selectors.html +489 -0
  277. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Time Series.html +173 -0
  278. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Tutorials.html +40 -0
  279. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/Updating Plots.html +228 -0
  280. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_altair_interactive.html +2216 -0
  281. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_altair_non_interactive.html +1170 -0
  282. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_bgplot_line_plot.html +318 -0
  283. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_bokeh_01_basic_plotting.html +1479 -0
  284. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_bokeh_02_styling_and_theming.html +1524 -0
  285. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_bokeh_03_data_sources_and_transformations.html +983 -0
  286. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_bokeh_04_adding_annotations.html +1280 -0
  287. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_bokeh_05_presentation_layouts.html +660 -0
  288. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_bokeh_06_linking_and_interactions.html +1563 -0
  289. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_bokeh_07_bar_and_categorical_data_plots.html +1888 -0
  290. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_bokeh_08_graph_and_network_plots.html +689 -0
  291. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_bokeh_09_geographic_plots.html +767 -0
  292. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_circular_times_table-short.html +475 -0
  293. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_circular_times_table.html +747 -0
  294. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_climate_change_forecast.html +1250 -0
  295. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_docs_example_dynamic.html +186 -0
  296. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_interactive_widgets.html +512 -0
  297. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_mathplot_vs_bqplot.html +407 -0
  298. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_nbi_widgets.html +629 -0
  299. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_nbi_widgets_bar_chart.html +95 -0
  300. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_nbi_widgets_hist_chart.html +93 -0
  301. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_nbi_widgets_line_chart.html +96 -0
  302. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_nbi_widgets_question_multiple_choice.html +70 -0
  303. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_nbi_widgets_question_short_answer.html +156 -0
  304. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_nbi_widgets_scatter_chart.html +95 -0
  305. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_nbi_widgets_scatter_drag_chart.html +93 -0
  306. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/j1_odes_in_python.html +955 -0
  307. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_examples_central_limit_theorem.html +290 -0
  308. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_examples_correlation.html +818 -0
  309. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_examples_empirical_distributions.html +351 -0
  310. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_examples_linear_regression.html +106 -0
  311. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_examples_probability_distribution_plots.html +228 -0
  312. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_examples_sampling_from_a_population.html +518 -0
  313. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_examples_variability_of_the_sample_mean.html +372 -0
  314. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_recipes_graphing.html +473 -0
  315. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_recipes_interactive_questions.html +242 -0
  316. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_recipes_layout.html +496 -0
  317. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_tutorial_interact.html +329 -0
  318. data/lib/starter_web/pages/public/_jupyter/notebooks/textbooks/nbi_docs_tutorial_monty_hall.html +866 -0
  319. data/lib/starter_web/pages/public/_jupyter/where_to_go.adoc +270 -0
  320. data/lib/starter_web/pages/public/features/general.adoc +74 -33
  321. data/lib/starter_web/pages/public/features/template.adoc +159 -68
  322. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_interactive_widgets.html +512 -512
  323. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets.html +629 -629
  324. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets_bar_chart.html +95 -95
  325. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets_hist_chart.html +93 -93
  326. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets_line_chart.html +96 -96
  327. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets_question_multiple_choice.html +70 -70
  328. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets_question_short_answer.html +156 -156
  329. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets_scatter_chart.html +95 -95
  330. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_nbi_widgets_scatter_drag_chart.html +93 -93
  331. data/lib/starter_web/pages/public/jupyter/notebooks/textbooks/j1_odes_in_python.html +955 -955
  332. data/lib/starter_web/pages/public/learn/_roundtrip/100_present_images.adoc +313 -0
  333. data/lib/starter_web/pages/public/learn/_roundtrip/100_present_videos.adoc +281 -0
  334. data/lib/starter_web/pages/public/learn/_roundtrip/200_typography.adoc +253 -0
  335. data/lib/starter_web/pages/public/learn/_roundtrip/300_icon_fonts.adoc +579 -0
  336. data/lib/starter_web/pages/public/learn/_roundtrip/400_asciidoc_extensions.adoc +718 -0
  337. data/lib/starter_web/pages/public/learn/_roundtrip/410_bs_modals_extentions.adoc +91 -0
  338. data/lib/starter_web/pages/public/learn/_roundtrip/420_responsive_tables_extensions.adoc +420 -0
  339. data/lib/starter_web/pages/public/learn/_roundtrip/500_themes.adoc +250 -0
  340. data/lib/starter_web/pages/public/learn/_roundtrip/600_quicksearch.adoc +425 -0
  341. data/lib/starter_web/pages/public/learn/_roundtrip/_includes/attributes.asciidoc +118 -0
  342. data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/100_gistblock.asciidoc +28 -0
  343. data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/410_bottom_info.asciidoc +14 -0
  344. data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/410_bottom_left_warning.asciidoc +11 -0
  345. data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/410_bottom_right_danger.asciidoc +11 -0
  346. data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/410_central_success.asciidoc +11 -0
  347. data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/410_full_height_left_info.asciidoc +11 -0
  348. data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/410_full_height_right_success.asciidoc +11 -0
  349. data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/410_table_bs_modal_examples.asciidoc +47 -0
  350. data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/410_top_info.asciidoc +11 -0
  351. data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/410_top_left_info.asciidoc +11 -0
  352. data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/410_top_right_success.asciidoc +11 -0
  353. data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/419_advanced_modals_demo.asciidoc +337 -0
  354. data/lib/starter_web/pages/public/learn/_roundtrip/_includes/documents/tables/bs_modal_examples.asciidoc +47 -0
  355. data/lib/starter_web/pages/public/learn/_roundtrip/_includes/google-ad.js +130 -0
  356. data/lib/starter_web/pages/public/learn/roundtrip/100_present_images.adoc +6 -5
  357. data/lib/starter_web/pages/public/learn/roundtrip/300_icon_fonts.adoc +1 -2
  358. data/lib/starter_web/pages/public/learn/roundtrip/400_asciidoc_extensions.adoc +4 -2
  359. data/lib/starter_web/pages/public/learn/roundtrip/500_themes.adoc +1 -1
  360. data/lib/starter_web/pages/public/learn/roundtrip/_includes/attributes.asciidoc +1 -1
  361. data/lib/starter_web/utilsrv/_defaults/package.json +1 -1
  362. data/lib/starter_web/utilsrv/package.json +1 -1
  363. metadata +384 -17
  364. data/lib/starter_web/_includes/_attributes.asciidoc +0 -575
  365. data/lib/starter_web/assets/images/pages/features/bootswatch-themes-1080x800.jpg +0 -0
  366. data/lib/starter_web/assets/images/pages/features/comments-1080x600.jpg +0 -0
  367. data/lib/starter_web/assets/images/pages/features/cookie-consent-1080x800.jpg +0 -0
  368. data/lib/starter_web/assets/images/pages/features/example-content-present-videos-1080x800.jpg +0 -0
  369. data/lib/starter_web/assets/images/pages/features/fab-1080x500.jpg +0 -0
  370. data/lib/starter_web/assets/images/pages/features/full-text-search-1080x800.jpg +0 -0
  371. data/lib/starter_web/assets/images/pages/features/global-mobile-traffic-1920x1080.jpg +0 -0
  372. data/lib/starter_web/assets/images/pages/features/google-lighthouse-1080x300.jpg +0 -0
  373. data/lib/starter_web/assets/images/pages/features/intro-panel-1080x800.jpg +0 -0
  374. data/lib/starter_web/assets/images/pages/features/mobile-navigation-600x800.jpg +0 -0
  375. data/lib/starter_web/assets/images/pages/features/native-speakers-by-language.jpg +0 -0
  376. data/lib/starter_web/assets/images/pages/features/nav-module-1080x300.jpg +0 -0
  377. data/lib/starter_web/assets/images/pages/features/teaser-banner-1080x600.jpg +0 -0
  378. data/lib/starter_web/assets/images/pages/features/translator-1080x800.jpg +0 -0
@@ -0,0 +1,1356 @@
1
+ {
2
+ "cells": [
3
+ {
4
+ "cell_type": "markdown",
5
+ "metadata": {},
6
+ "source": [
7
+ "## 6. Linking and Interactions\n",
8
+ "\n",
9
+ "Now that we know from the previous chapter how multiple plots can be placed together in a layout, we can start to look at how different plots can be linked together, or how plots can be linked to widgets. "
10
+ ]
11
+ },
12
+ {
13
+ "cell_type": "code",
14
+ "execution_count": 1,
15
+ "metadata": {},
16
+ "outputs": [],
17
+ "source": [
18
+ "from bokeh import events\n",
19
+ "from bokeh.io import output_notebook, show\n",
20
+ "from bokeh.plotting import figure\n",
21
+ "\n",
22
+ "from bokeh.layouts import gridplot, column, row\n",
23
+ "from bokeh.models import Button, ColumnDataSource, CustomJS, Div, HoverTool, TapTool\n",
24
+ "from bokeh.models.widgets import Slider, Button\n",
25
+ "\n",
26
+ "from random import random\n",
27
+ "import numpy as np"
28
+ ]
29
+ },
30
+ {
31
+ "cell_type": "code",
32
+ "execution_count": 2,
33
+ "metadata": {},
34
+ "outputs": [
35
+ {
36
+ "data": {
37
+ "text/html": [
38
+ "<div class=\"bk-root\">\n",
39
+ " <a href=\"https://bokeh.org\" target=\"_blank\" class=\"bk-logo bk-logo-small bk-logo-notebook\"></a>\n",
40
+ " <span id=\"1002\">Loading BokehJS ...</span>\n",
41
+ " </div>\n"
42
+ ]
43
+ },
44
+ "metadata": {},
45
+ "output_type": "display_data"
46
+ },
47
+ {
48
+ "data": {
49
+ "application/javascript": [
50
+ "(function(root) {\n",
51
+ " function now() {\n",
52
+ " return new Date();\n",
53
+ " }\n",
54
+ "\n",
55
+ " const force = true;\n",
56
+ "\n",
57
+ " if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n",
58
+ " root._bokeh_onload_callbacks = [];\n",
59
+ " root._bokeh_is_loading = undefined;\n",
60
+ " }\n",
61
+ "\n",
62
+ "const JS_MIME_TYPE = 'application/javascript';\n",
63
+ " const HTML_MIME_TYPE = 'text/html';\n",
64
+ " const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n",
65
+ " const CLASS_NAME = 'output_bokeh rendered_html';\n",
66
+ "\n",
67
+ " /**\n",
68
+ " * Render data to the DOM node\n",
69
+ " */\n",
70
+ " function render(props, node) {\n",
71
+ " const script = document.createElement(\"script\");\n",
72
+ " node.appendChild(script);\n",
73
+ " }\n",
74
+ "\n",
75
+ " /**\n",
76
+ " * Handle when an output is cleared or removed\n",
77
+ " */\n",
78
+ " function handleClearOutput(event, handle) {\n",
79
+ " const cell = handle.cell;\n",
80
+ "\n",
81
+ " const id = cell.output_area._bokeh_element_id;\n",
82
+ " const server_id = cell.output_area._bokeh_server_id;\n",
83
+ " // Clean up Bokeh references\n",
84
+ " if (id != null && id in Bokeh.index) {\n",
85
+ " Bokeh.index[id].model.document.clear();\n",
86
+ " delete Bokeh.index[id];\n",
87
+ " }\n",
88
+ "\n",
89
+ " if (server_id !== undefined) {\n",
90
+ " // Clean up Bokeh references\n",
91
+ " const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n",
92
+ " cell.notebook.kernel.execute(cmd_clean, {\n",
93
+ " iopub: {\n",
94
+ " output: function(msg) {\n",
95
+ " const id = msg.content.text.trim();\n",
96
+ " if (id in Bokeh.index) {\n",
97
+ " Bokeh.index[id].model.document.clear();\n",
98
+ " delete Bokeh.index[id];\n",
99
+ " }\n",
100
+ " }\n",
101
+ " }\n",
102
+ " });\n",
103
+ " // Destroy server and session\n",
104
+ " const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n",
105
+ " cell.notebook.kernel.execute(cmd_destroy);\n",
106
+ " }\n",
107
+ " }\n",
108
+ "\n",
109
+ " /**\n",
110
+ " * Handle when a new output is added\n",
111
+ " */\n",
112
+ " function handleAddOutput(event, handle) {\n",
113
+ " const output_area = handle.output_area;\n",
114
+ " const output = handle.output;\n",
115
+ "\n",
116
+ " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n",
117
+ " if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n",
118
+ " return\n",
119
+ " }\n",
120
+ "\n",
121
+ " const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n",
122
+ "\n",
123
+ " if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n",
124
+ " toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n",
125
+ " // store reference to embed id on output_area\n",
126
+ " output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n",
127
+ " }\n",
128
+ " if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n",
129
+ " const bk_div = document.createElement(\"div\");\n",
130
+ " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n",
131
+ " const script_attrs = bk_div.children[0].attributes;\n",
132
+ " for (let i = 0; i < script_attrs.length; i++) {\n",
133
+ " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n",
134
+ " toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n",
135
+ " }\n",
136
+ " // store reference to server id on output_area\n",
137
+ " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n",
138
+ " }\n",
139
+ " }\n",
140
+ "\n",
141
+ " function register_renderer(events, OutputArea) {\n",
142
+ "\n",
143
+ " function append_mime(data, metadata, element) {\n",
144
+ " // create a DOM node to render to\n",
145
+ " const toinsert = this.create_output_subarea(\n",
146
+ " metadata,\n",
147
+ " CLASS_NAME,\n",
148
+ " EXEC_MIME_TYPE\n",
149
+ " );\n",
150
+ " this.keyboard_manager.register_events(toinsert);\n",
151
+ " // Render to node\n",
152
+ " const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n",
153
+ " render(props, toinsert[toinsert.length - 1]);\n",
154
+ " element.append(toinsert);\n",
155
+ " return toinsert\n",
156
+ " }\n",
157
+ "\n",
158
+ " /* Handle when an output is cleared or removed */\n",
159
+ " events.on('clear_output.CodeCell', handleClearOutput);\n",
160
+ " events.on('delete.Cell', handleClearOutput);\n",
161
+ "\n",
162
+ " /* Handle when a new output is added */\n",
163
+ " events.on('output_added.OutputArea', handleAddOutput);\n",
164
+ "\n",
165
+ " /**\n",
166
+ " * Register the mime type and append_mime function with output_area\n",
167
+ " */\n",
168
+ " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n",
169
+ " /* Is output safe? */\n",
170
+ " safe: true,\n",
171
+ " /* Index of renderer in `output_area.display_order` */\n",
172
+ " index: 0\n",
173
+ " });\n",
174
+ " }\n",
175
+ "\n",
176
+ " // register the mime type if in Jupyter Notebook environment and previously unregistered\n",
177
+ " if (root.Jupyter !== undefined) {\n",
178
+ " const events = require('base/js/events');\n",
179
+ " const OutputArea = require('notebook/js/outputarea').OutputArea;\n",
180
+ "\n",
181
+ " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n",
182
+ " register_renderer(events, OutputArea);\n",
183
+ " }\n",
184
+ " }\n",
185
+ " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n",
186
+ " root._bokeh_timeout = Date.now() + 5000;\n",
187
+ " root._bokeh_failed_load = false;\n",
188
+ " }\n",
189
+ "\n",
190
+ " const NB_LOAD_WARNING = {'data': {'text/html':\n",
191
+ " \"<div style='background-color: #fdd'>\\n\"+\n",
192
+ " \"<p>\\n\"+\n",
193
+ " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n",
194
+ " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n",
195
+ " \"</p>\\n\"+\n",
196
+ " \"<ul>\\n\"+\n",
197
+ " \"<li>re-rerun `output_notebook()` to attempt to load from CDN again, or</li>\\n\"+\n",
198
+ " \"<li>use INLINE resources instead, as so:</li>\\n\"+\n",
199
+ " \"</ul>\\n\"+\n",
200
+ " \"<code>\\n\"+\n",
201
+ " \"from bokeh.resources import INLINE\\n\"+\n",
202
+ " \"output_notebook(resources=INLINE)\\n\"+\n",
203
+ " \"</code>\\n\"+\n",
204
+ " \"</div>\"}};\n",
205
+ "\n",
206
+ " function display_loaded() {\n",
207
+ " const el = document.getElementById(\"1002\");\n",
208
+ " if (el != null) {\n",
209
+ " el.textContent = \"BokehJS is loading...\";\n",
210
+ " }\n",
211
+ " if (root.Bokeh !== undefined) {\n",
212
+ " if (el != null) {\n",
213
+ " el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n",
214
+ " }\n",
215
+ " } else if (Date.now() < root._bokeh_timeout) {\n",
216
+ " setTimeout(display_loaded, 100)\n",
217
+ " }\n",
218
+ " }\n",
219
+ "\n",
220
+ " function run_callbacks() {\n",
221
+ " try {\n",
222
+ " root._bokeh_onload_callbacks.forEach(function(callback) {\n",
223
+ " if (callback != null)\n",
224
+ " callback();\n",
225
+ " });\n",
226
+ " } finally {\n",
227
+ " delete root._bokeh_onload_callbacks\n",
228
+ " }\n",
229
+ " console.debug(\"Bokeh: all callbacks have finished\");\n",
230
+ " }\n",
231
+ "\n",
232
+ " function load_libs(css_urls, js_urls, callback) {\n",
233
+ " if (css_urls == null) css_urls = [];\n",
234
+ " if (js_urls == null) js_urls = [];\n",
235
+ "\n",
236
+ " root._bokeh_onload_callbacks.push(callback);\n",
237
+ " if (root._bokeh_is_loading > 0) {\n",
238
+ " console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n",
239
+ " return null;\n",
240
+ " }\n",
241
+ " if (js_urls == null || js_urls.length === 0) {\n",
242
+ " run_callbacks();\n",
243
+ " return null;\n",
244
+ " }\n",
245
+ " console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n",
246
+ " root._bokeh_is_loading = css_urls.length + js_urls.length;\n",
247
+ "\n",
248
+ " function on_load() {\n",
249
+ " root._bokeh_is_loading--;\n",
250
+ " if (root._bokeh_is_loading === 0) {\n",
251
+ " console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n",
252
+ " run_callbacks()\n",
253
+ " }\n",
254
+ " }\n",
255
+ "\n",
256
+ " function on_error(url) {\n",
257
+ " console.error(\"failed to load \" + url);\n",
258
+ " }\n",
259
+ "\n",
260
+ " for (let i = 0; i < css_urls.length; i++) {\n",
261
+ " const url = css_urls[i];\n",
262
+ " const element = document.createElement(\"link\");\n",
263
+ " element.onload = on_load;\n",
264
+ " element.onerror = on_error.bind(null, url);\n",
265
+ " element.rel = \"stylesheet\";\n",
266
+ " element.type = \"text/css\";\n",
267
+ " element.href = url;\n",
268
+ " console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n",
269
+ " document.body.appendChild(element);\n",
270
+ " }\n",
271
+ "\n",
272
+ " for (let i = 0; i < js_urls.length; i++) {\n",
273
+ " const url = js_urls[i];\n",
274
+ " const element = document.createElement('script');\n",
275
+ " element.onload = on_load;\n",
276
+ " element.onerror = on_error.bind(null, url);\n",
277
+ " element.async = false;\n",
278
+ " element.src = url;\n",
279
+ " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n",
280
+ " document.head.appendChild(element);\n",
281
+ " }\n",
282
+ " };\n",
283
+ "\n",
284
+ " function inject_raw_css(css) {\n",
285
+ " const element = document.createElement(\"style\");\n",
286
+ " element.appendChild(document.createTextNode(css));\n",
287
+ " document.body.appendChild(element);\n",
288
+ " }\n",
289
+ "\n",
290
+ " const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-2.4.3.min.js\"];\n",
291
+ " const css_urls = [];\n",
292
+ "\n",
293
+ " const inline_js = [ function(Bokeh) {\n",
294
+ " Bokeh.set_log_level(\"info\");\n",
295
+ " },\n",
296
+ "function(Bokeh) {\n",
297
+ " }\n",
298
+ " ];\n",
299
+ "\n",
300
+ " function run_inline_js() {\n",
301
+ " if (root.Bokeh !== undefined || force === true) {\n",
302
+ " for (let i = 0; i < inline_js.length; i++) {\n",
303
+ " inline_js[i].call(root, root.Bokeh);\n",
304
+ " }\n",
305
+ "if (force === true) {\n",
306
+ " display_loaded();\n",
307
+ " }} else if (Date.now() < root._bokeh_timeout) {\n",
308
+ " setTimeout(run_inline_js, 100);\n",
309
+ " } else if (!root._bokeh_failed_load) {\n",
310
+ " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n",
311
+ " root._bokeh_failed_load = true;\n",
312
+ " } else if (force !== true) {\n",
313
+ " const cell = $(document.getElementById(\"1002\")).parents('.cell').data().cell;\n",
314
+ " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n",
315
+ " }\n",
316
+ " }\n",
317
+ "\n",
318
+ " if (root._bokeh_is_loading === 0) {\n",
319
+ " console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n",
320
+ " run_inline_js();\n",
321
+ " } else {\n",
322
+ " load_libs(css_urls, js_urls, function() {\n",
323
+ " console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n",
324
+ " run_inline_js();\n",
325
+ " });\n",
326
+ " }\n",
327
+ "}(window));"
328
+ ],
329
+ "application/vnd.bokehjs_load.v0+json": "(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\n\n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"<div style='background-color: #fdd'>\\n\"+\n \"<p>\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"</p>\\n\"+\n \"<ul>\\n\"+\n \"<li>re-rerun `output_notebook()` to attempt to load from CDN again, or</li>\\n\"+\n \"<li>use INLINE resources instead, as so:</li>\\n\"+\n \"</ul>\\n\"+\n \"<code>\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"</code>\\n\"+\n \"</div>\"}};\n\n function display_loaded() {\n const el = document.getElementById(\"1002\");\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-2.4.3.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-2.4.3.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\nif (force === true) {\n display_loaded();\n }} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n const cell = $(document.getElementById(\"1002\")).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));"
330
+ },
331
+ "metadata": {},
332
+ "output_type": "display_data"
333
+ }
334
+ ],
335
+ "source": [
336
+ "#nbi:hide_out\n",
337
+ "# Make all outputs INLINE for default (why a hell this is needed !!!)\n",
338
+ "output_notebook()"
339
+ ]
340
+ },
341
+ {
342
+ "cell_type": "markdown",
343
+ "metadata": {},
344
+ "source": [
345
+ "### Linked Interactions\n",
346
+ "\n",
347
+ "It is possible to link various interactions between different Bokeh plots. For instance, the ranges of two (or more) plots can be linked, so that when one of the plots is panned (or zoomed, or otherwise has its range changed) the other plots will update in unison. It is also possible to link selections between two plots, so that when items are selected on one plot, the corresponding items on the second plot also become selected. "
348
+ ]
349
+ },
350
+ {
351
+ "cell_type": "markdown",
352
+ "metadata": {},
353
+ "source": [
354
+ "#### Linked panning\n",
355
+ "\n",
356
+ "Linked panning (when multiple plots have ranges that stay in sync) is simple to spell with Bokeh. You simply share the appropriate range objects between two (or more) plots. The example below shows how to accomplish this by linking the ranges of three plots in various ways:"
357
+ ]
358
+ },
359
+ {
360
+ "cell_type": "code",
361
+ "execution_count": 3,
362
+ "metadata": {},
363
+ "outputs": [],
364
+ "source": [
365
+ "# from bokeh.layouts import gridplot"
366
+ ]
367
+ },
368
+ {
369
+ "cell_type": "code",
370
+ "execution_count": 4,
371
+ "metadata": {},
372
+ "outputs": [
373
+ {
374
+ "data": {
375
+ "text/html": [
376
+ "\n",
377
+ " <div class=\"bk-root\" id=\"308e4ed4-8494-4e6d-9c43-0b6952ac0f20\" data-root-id=\"1126\"></div>\n"
378
+ ]
379
+ },
380
+ "metadata": {},
381
+ "output_type": "display_data"
382
+ },
383
+ {
384
+ "data": {
385
+ "application/javascript": [
386
+ "(function(root) {\n",
387
+ " function embed_document(root) {\n",
388
+ " const docs_json = {\"04272af0-687d-4eec-bda1-1004eb86b657\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"children\":[{\"id\":\"1125\"},{\"id\":\"1123\"}]},\"id\":\"1126\",\"type\":\"Column\"},{\"attributes\":{},\"id\":\"1115\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"coordinates\":null,\"group\":null},\"id\":\"1112\",\"type\":\"Title\"},{\"attributes\":{\"tools\":[{\"id\":\"1020\"},{\"id\":\"1021\"},{\"id\":\"1022\"}]},\"id\":\"1023\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"1118\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1119\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1116\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1120\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1121\",\"type\":\"Selection\"},{\"attributes\":{\"toolbar\":{\"id\":\"1124\"},\"toolbar_location\":\"above\"},\"id\":\"1125\",\"type\":\"ToolbarBox\"},{\"attributes\":{\"toolbars\":[{\"id\":\"1023\"},{\"id\":\"1051\"},{\"id\":\"1080\"}],\"tools\":[{\"id\":\"1020\"},{\"id\":\"1021\"},{\"id\":\"1022\"},{\"id\":\"1048\"},{\"id\":\"1049\"},{\"id\":\"1050\"},{\"id\":\"1077\"},{\"id\":\"1078\"},{\"id\":\"1079\"}]},\"id\":\"1124\",\"type\":\"ProxyToolbar\"},{\"attributes\":{\"axis\":{\"id\":\"1012\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1015\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1022\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"1004\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1017\",\"type\":\"BasicTicker\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1093\"},\"group\":null,\"major_label_policy\":{\"id\":\"1094\"},\"ticker\":{\"id\":\"1017\"}},\"id\":\"1016\",\"type\":\"LinearAxis\"},{\"attributes\":{\"tools\":[{\"id\":\"1077\"},{\"id\":\"1078\"},{\"id\":\"1079\"}]},\"id\":\"1080\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"1105\",\"type\":\"AllLabels\"},{\"attributes\":{\"below\":[{\"id\":\"1040\"}],\"center\":[{\"id\":\"1043\"},{\"id\":\"1047\"}],\"height\":250,\"left\":[{\"id\":\"1044\"}],\"renderers\":[{\"id\":\"1059\"}],\"title\":{\"id\":\"1101\"},\"toolbar\":{\"id\":\"1051\"},\"toolbar_location\":null,\"width\":250,\"x_range\":{\"id\":\"1004\"},\"x_scale\":{\"id\":\"1036\"},\"y_range\":{\"id\":\"1006\"},\"y_scale\":{\"id\":\"1038\"}},\"id\":\"1033\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"axis\":{\"id\":\"1044\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1047\",\"type\":\"Grid\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"olive\"},\"hatch_alpha\":{\"value\":0.2},\"hatch_color\":{\"value\":\"olive\"},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"olive\"},\"marker\":{\"value\":\"square\"},\"size\":{\"value\":10},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1087\",\"type\":\"Scatter\"},{\"attributes\":{},\"id\":\"1107\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"tools\":[{\"id\":\"1048\"},{\"id\":\"1049\"},{\"id\":\"1050\"}]},\"id\":\"1051\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"1048\",\"type\":\"PanTool\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1055\"},\"glyph\":{\"id\":\"1056\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1058\"},\"nonselection_glyph\":{\"id\":\"1057\"},\"view\":{\"id\":\"1060\"}},\"id\":\"1059\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1021\",\"type\":\"WheelZoomTool\"},{\"attributes\":{},\"id\":\"1049\",\"type\":\"WheelZoomTool\"},{\"attributes\":{},\"id\":\"1050\",\"type\":\"ResetTool\"},{\"attributes\":{\"fill_color\":{\"value\":\"olive\"},\"hatch_color\":{\"value\":\"olive\"},\"line_color\":{\"value\":\"olive\"},\"marker\":{\"value\":\"square\"},\"size\":{\"value\":10},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1085\",\"type\":\"Scatter\"},{\"attributes\":{\"axis\":{\"id\":\"1016\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1019\",\"type\":\"Grid\"},{\"attributes\":{\"fill_color\":{\"value\":\"firebrick\"},\"hatch_color\":{\"value\":\"firebrick\"},\"line_color\":{\"value\":\"firebrick\"},\"marker\":{\"value\":\"triangle\"},\"size\":{\"value\":10},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1056\",\"type\":\"Scatter\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1096\"},\"group\":null,\"major_label_policy\":{\"id\":\"1097\"},\"ticker\":{\"id\":\"1013\"}},\"id\":\"1012\",\"type\":\"LinearAxis\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1084\"},\"glyph\":{\"id\":\"1085\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1087\"},\"nonselection_glyph\":{\"id\":\"1086\"},\"view\":{\"id\":\"1089\"}},\"id\":\"1088\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"firebrick\"},\"hatch_alpha\":{\"value\":0.2},\"hatch_color\":{\"value\":\"firebrick\"},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"firebrick\"},\"marker\":{\"value\":\"triangle\"},\"size\":{\"value\":10},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1058\",\"type\":\"Scatter\"},{\"attributes\":{\"source\":{\"id\":\"1084\"}},\"id\":\"1089\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1110\",\"type\":\"Selection\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"olive\"},\"hatch_alpha\":{\"value\":0.1},\"hatch_color\":{\"value\":\"olive\"},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"olive\"},\"marker\":{\"value\":\"square\"},\"size\":{\"value\":10},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1086\",\"type\":\"Scatter\"},{\"attributes\":{\"coordinates\":null,\"group\":null},\"id\":\"1090\",\"type\":\"Title\"},{\"attributes\":{\"source\":{\"id\":\"1055\"}},\"id\":\"1060\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1008\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1096\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"data\":{\"x\":[0,1,2,3,4,5,6,7,8,9,10],\"y\":[10,9,8,7,6,5,4,3,2,1,0]},\"selected\":{\"id\":\"1110\"},\"selection_policy\":{\"id\":\"1109\"}},\"id\":\"1055\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"firebrick\"},\"hatch_alpha\":{\"value\":0.1},\"hatch_color\":{\"value\":\"firebrick\"},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"firebrick\"},\"marker\":{\"value\":\"triangle\"},\"size\":{\"value\":10},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1057\",\"type\":\"Scatter\"},{\"attributes\":{},\"id\":\"1094\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1063\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1093\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1070\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1065\",\"type\":\"LinearScale\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"navy\"},\"hatch_alpha\":{\"value\":0.1},\"hatch_color\":{\"value\":\"navy\"},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"navy\"},\"size\":{\"value\":10},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1029\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1097\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1099\",\"type\":\"Selection\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1027\"},\"glyph\":{\"id\":\"1028\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1030\"},\"nonselection_glyph\":{\"id\":\"1029\"},\"view\":{\"id\":\"1032\"}},\"id\":\"1031\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1067\",\"type\":\"LinearScale\"},{\"attributes\":{\"fill_color\":{\"value\":\"navy\"},\"hatch_color\":{\"value\":\"navy\"},\"line_color\":{\"value\":\"navy\"},\"size\":{\"value\":10},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1028\",\"type\":\"Circle\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1118\"},\"group\":null,\"major_label_policy\":{\"id\":\"1119\"},\"ticker\":{\"id\":\"1070\"}},\"id\":\"1069\",\"type\":\"LinearAxis\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"navy\"},\"hatch_alpha\":{\"value\":0.2},\"hatch_color\":{\"value\":\"navy\"},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"navy\"},\"size\":{\"value\":10},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1030\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1098\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"below\":[{\"id\":\"1069\"}],\"center\":[{\"id\":\"1072\"},{\"id\":\"1076\"}],\"height\":250,\"left\":[{\"id\":\"1073\"}],\"renderers\":[{\"id\":\"1088\"}],\"title\":{\"id\":\"1112\"},\"toolbar\":{\"id\":\"1080\"},\"toolbar_location\":null,\"width\":250,\"x_range\":{\"id\":\"1004\"},\"x_scale\":{\"id\":\"1065\"},\"y_range\":{\"id\":\"1063\"},\"y_scale\":{\"id\":\"1067\"}},\"id\":\"1061\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"axis\":{\"id\":\"1069\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1072\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1074\",\"type\":\"BasicTicker\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1115\"},\"group\":null,\"major_label_policy\":{\"id\":\"1116\"},\"ticker\":{\"id\":\"1074\"}},\"id\":\"1073\",\"type\":\"LinearAxis\"},{\"attributes\":{\"source\":{\"id\":\"1027\"}},\"id\":\"1032\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1020\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"1010\",\"type\":\"LinearScale\"},{\"attributes\":{\"data\":{\"x\":[0,1,2,3,4,5,6,7,8,9,10],\"y\":[0,1,2,3,4,5,6,7,8,9,10]},\"selected\":{\"id\":\"1099\"},\"selection_policy\":{\"id\":\"1098\"}},\"id\":\"1027\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1041\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1013\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1036\",\"type\":\"LinearScale\"},{\"attributes\":{\"axis\":{\"id\":\"1073\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1076\",\"type\":\"Grid\"},{\"attributes\":{\"data\":{\"x\":[0,1,2,3,4,5,6,7,8,9,10],\"y\":[5,4,3,2,1,0,1,2,3,4,5]},\"selected\":{\"id\":\"1121\"},\"selection_policy\":{\"id\":\"1120\"}},\"id\":\"1084\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"below\":[{\"id\":\"1012\"}],\"center\":[{\"id\":\"1015\"},{\"id\":\"1019\"}],\"height\":250,\"left\":[{\"id\":\"1016\"}],\"renderers\":[{\"id\":\"1031\"}],\"title\":{\"id\":\"1090\"},\"toolbar\":{\"id\":\"1023\"},\"toolbar_location\":null,\"width\":250,\"x_range\":{\"id\":\"1004\"},\"x_scale\":{\"id\":\"1008\"},\"y_range\":{\"id\":\"1006\"},\"y_scale\":{\"id\":\"1010\"}},\"id\":\"1003\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"children\":[[{\"id\":\"1003\"},0,0],[{\"id\":\"1033\"},0,1],[{\"id\":\"1061\"},0,2]]},\"id\":\"1123\",\"type\":\"GridBox\"},{\"attributes\":{},\"id\":\"1104\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1038\",\"type\":\"LinearScale\"},{\"attributes\":{\"coordinates\":null,\"group\":null},\"id\":\"1101\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1077\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"1045\",\"type\":\"BasicTicker\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1107\"},\"group\":null,\"major_label_policy\":{\"id\":\"1108\"},\"ticker\":{\"id\":\"1041\"}},\"id\":\"1040\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1108\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1078\",\"type\":\"WheelZoomTool\"},{\"attributes\":{},\"id\":\"1079\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"1006\",\"type\":\"DataRange1d\"},{\"attributes\":{\"axis\":{\"id\":\"1040\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1043\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1109\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1104\"},\"group\":null,\"major_label_policy\":{\"id\":\"1105\"},\"ticker\":{\"id\":\"1045\"}},\"id\":\"1044\",\"type\":\"LinearAxis\"}],\"root_ids\":[\"1126\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n",
389
+ " const render_items = [{\"docid\":\"04272af0-687d-4eec-bda1-1004eb86b657\",\"root_ids\":[\"1126\"],\"roots\":{\"1126\":\"308e4ed4-8494-4e6d-9c43-0b6952ac0f20\"}}];\n",
390
+ " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
391
+ " }\n",
392
+ " if (root.Bokeh !== undefined) {\n",
393
+ " embed_document(root);\n",
394
+ " } else {\n",
395
+ " let attempts = 0;\n",
396
+ " const timer = setInterval(function(root) {\n",
397
+ " if (root.Bokeh !== undefined) {\n",
398
+ " clearInterval(timer);\n",
399
+ " embed_document(root);\n",
400
+ " } else {\n",
401
+ " attempts++;\n",
402
+ " if (attempts > 100) {\n",
403
+ " clearInterval(timer);\n",
404
+ " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
405
+ " }\n",
406
+ " }\n",
407
+ " }, 10, root)\n",
408
+ " }\n",
409
+ "})(window);"
410
+ ],
411
+ "application/vnd.bokehjs_exec.v0+json": ""
412
+ },
413
+ "metadata": {
414
+ "application/vnd.bokehjs_exec.v0+json": {
415
+ "id": "1126"
416
+ }
417
+ },
418
+ "output_type": "display_data"
419
+ }
420
+ ],
421
+ "source": [
422
+ "x = list(range(11))\n",
423
+ "y0, y1, y2 = x, [10-i for i in x], [abs(i-5) for i in x]\n",
424
+ "\n",
425
+ "plot_options = dict(\n",
426
+ " width=250,\n",
427
+ " plot_height=250,\n",
428
+ " tools='pan, wheel_zoom, reset'\n",
429
+ ")\n",
430
+ "\n",
431
+ "# create a new plot\n",
432
+ "s1 = figure(**plot_options)\n",
433
+ "s1.circle(x, y0, size=10, color=\"navy\")\n",
434
+ "\n",
435
+ "# create a new plot and share both ranges\n",
436
+ "s2 = figure(\n",
437
+ " x_range=s1.x_range,\n",
438
+ " y_range=s1.y_range,\n",
439
+ " **plot_options\n",
440
+ ")\n",
441
+ "s2.triangle(\n",
442
+ " x,\n",
443
+ " y1,\n",
444
+ " size=10,\n",
445
+ " color=\"firebrick\"\n",
446
+ ")\n",
447
+ "\n",
448
+ "# create a new plot and share only one range\n",
449
+ "s3 = figure(\n",
450
+ " x_range=s1.x_range,\n",
451
+ " **plot_options\n",
452
+ ")\n",
453
+ "s3.square(\n",
454
+ " x,\n",
455
+ " y2,\n",
456
+ " size=10,\n",
457
+ " color=\"olive\"\n",
458
+ ")\n",
459
+ "\n",
460
+ "p = gridplot(\n",
461
+ " [[s1, s2, s3]]\n",
462
+ ")\n",
463
+ "\n",
464
+ "# show the results\n",
465
+ "show(p)"
466
+ ]
467
+ },
468
+ {
469
+ "cell_type": "markdown",
470
+ "metadata": {},
471
+ "source": [
472
+ "#### Linked brushing\n",
473
+ "\n",
474
+ "Linking selections is accomplished in a similar way, by sharing data sources between plots. Note that normally with ``bokeh.plotting`` and ``bokeh.charts`` creating a default data source for simple plots is handled automatically. However to share a data source, we must create them by hand and pass them explicitly. This is illustrated in the example below:"
475
+ ]
476
+ },
477
+ {
478
+ "cell_type": "code",
479
+ "execution_count": 5,
480
+ "metadata": {},
481
+ "outputs": [],
482
+ "source": [
483
+ "# from bokeh.models import ColumnDataSource"
484
+ ]
485
+ },
486
+ {
487
+ "cell_type": "code",
488
+ "execution_count": 6,
489
+ "metadata": {},
490
+ "outputs": [
491
+ {
492
+ "data": {
493
+ "text/html": [
494
+ "\n",
495
+ " <div class=\"bk-root\" id=\"ded72a6f-e361-48c0-9c62-52ad12e55591\" data-root-id=\"1405\"></div>\n"
496
+ ]
497
+ },
498
+ "metadata": {},
499
+ "output_type": "display_data"
500
+ },
501
+ {
502
+ "data": {
503
+ "application/javascript": [
504
+ "(function(root) {\n",
505
+ " function embed_document(root) {\n",
506
+ " const docs_json = {\"ac0f847d-4cf4-4e37-a5ef-fea3652049c2\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"children\":[{\"id\":\"1404\"},{\"id\":\"1402\"}]},\"id\":\"1405\",\"type\":\"Column\"},{\"attributes\":{\"axis\":{\"id\":\"1317\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1320\",\"type\":\"Grid\"},{\"attributes\":{\"toolbar\":{\"id\":\"1403\"},\"toolbar_location\":\"above\"},\"id\":\"1404\",\"type\":\"ToolbarBox\"},{\"attributes\":{\"tools\":[{\"id\":\"1359\"},{\"id\":\"1360\"},{\"id\":\"1361\"},{\"id\":\"1362\"}]},\"id\":\"1365\",\"type\":\"Toolbar\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"#1f77b4\"},\"hatch_alpha\":{\"value\":0.2},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"#1f77b4\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y0\"}},\"id\":\"1339\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1322\",\"type\":\"BasicTicker\"},{\"attributes\":{\"overlay\":{\"id\":\"1363\"}},\"id\":\"1359\",\"type\":\"BoxSelectTool\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1379\"},\"group\":null,\"major_label_policy\":{\"id\":\"1380\"},\"ticker\":{\"id\":\"1322\"}},\"id\":\"1321\",\"type\":\"LinearAxis\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1382\"},\"group\":null,\"major_label_policy\":{\"id\":\"1383\"},\"ticker\":{\"id\":\"1318\"}},\"id\":\"1317\",\"type\":\"LinearAxis\"},{\"attributes\":{\"overlay\":{\"id\":\"1364\"}},\"id\":\"1360\",\"type\":\"LassoSelectTool\"},{\"attributes\":{\"children\":[[{\"id\":\"1308\"},0,0],[{\"id\":\"1342\"},0,1]]},\"id\":\"1402\",\"type\":\"GridBox\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"#1f77b4\"},\"hatch_alpha\":{\"value\":0.2},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"#1f77b4\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y1\"}},\"id\":\"1373\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1361\",\"type\":\"HelpTool\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1307\"},\"glyph\":{\"id\":\"1337\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1339\"},\"nonselection_glyph\":{\"id\":\"1338\"},\"view\":{\"id\":\"1341\"}},\"id\":\"1340\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"coordinates\":null,\"fill_alpha\":0.5,\"fill_color\":\"lightgrey\",\"group\":null,\"level\":\"overlay\",\"line_alpha\":1.0,\"line_color\":\"black\",\"line_dash\":[4,4],\"line_width\":2,\"syncable\":false,\"xs_units\":\"screen\",\"ys_units\":\"screen\"},\"id\":\"1330\",\"type\":\"PolyAnnotation\"},{\"attributes\":{},\"id\":\"1362\",\"type\":\"ResetTool\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1395\"},\"group\":null,\"major_label_policy\":{\"id\":\"1396\"},\"ticker\":{\"id\":\"1352\"}},\"id\":\"1351\",\"type\":\"LinearAxis\"},{\"attributes\":{\"coordinates\":null,\"group\":null},\"id\":\"1376\",\"type\":\"Title\"},{\"attributes\":{\"data\":{\"x\":[-20,-19,-18,-17,-16,-15,-14,-13,-12,-11,-10,-9,-8,-7,-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],\"y0\":[20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20],\"y1\":[400,361,324,289,256,225,196,169,144,121,100,81,64,49,36,25,16,9,4,1,0,1,4,9,16,25,36,49,64,81,100,121,144,169,196,225,256,289,324,361,400]},\"selected\":{\"id\":\"1385\"},\"selection_policy\":{\"id\":\"1384\"}},\"id\":\"1307\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"1380\",\"type\":\"AllLabels\"},{\"attributes\":{\"axis\":{\"id\":\"1321\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1324\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1382\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"below\":[{\"id\":\"1317\"}],\"center\":[{\"id\":\"1320\"},{\"id\":\"1324\"}],\"height\":300,\"left\":[{\"id\":\"1321\"}],\"renderers\":[{\"id\":\"1340\"}],\"title\":{\"id\":\"1376\"},\"toolbar\":{\"id\":\"1331\"},\"toolbar_location\":null,\"width\":400,\"x_range\":{\"id\":\"1309\"},\"x_scale\":{\"id\":\"1313\"},\"y_range\":{\"id\":\"1311\"},\"y_scale\":{\"id\":\"1315\"}},\"id\":\"1308\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"toolbars\":[{\"id\":\"1331\"},{\"id\":\"1365\"}],\"tools\":[{\"id\":\"1325\"},{\"id\":\"1326\"},{\"id\":\"1327\"},{\"id\":\"1328\"},{\"id\":\"1359\"},{\"id\":\"1360\"},{\"id\":\"1361\"},{\"id\":\"1362\"}]},\"id\":\"1403\",\"type\":\"ProxyToolbar\"},{\"attributes\":{},\"id\":\"1379\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1352\",\"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\":\"1329\",\"type\":\"BoxAnnotation\"},{\"attributes\":{},\"id\":\"1393\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1383\",\"type\":\"AllLabels\"},{\"attributes\":{\"below\":[{\"id\":\"1351\"}],\"center\":[{\"id\":\"1354\"},{\"id\":\"1358\"}],\"height\":300,\"left\":[{\"id\":\"1355\"}],\"renderers\":[{\"id\":\"1374\"}],\"title\":{\"id\":\"1389\"},\"toolbar\":{\"id\":\"1365\"},\"toolbar_location\":null,\"width\":400,\"x_range\":{\"id\":\"1343\"},\"x_scale\":{\"id\":\"1347\"},\"y_range\":{\"id\":\"1345\"},\"y_scale\":{\"id\":\"1349\"}},\"id\":\"1342\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"1345\",\"type\":\"DataRange1d\"},{\"attributes\":{\"axis\":{\"id\":\"1351\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1354\",\"type\":\"Grid\"},{\"attributes\":{\"overlay\":{\"id\":\"1329\"}},\"id\":\"1325\",\"type\":\"BoxSelectTool\"},{\"attributes\":{},\"id\":\"1384\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"overlay\":{\"id\":\"1330\"}},\"id\":\"1326\",\"type\":\"LassoSelectTool\"},{\"attributes\":{\"bottom_units\":\"screen\",\"coordinates\":null,\"fill_alpha\":0.5,\"fill_color\":\"lightgrey\",\"group\":null,\"left_units\":\"screen\",\"level\":\"overlay\",\"line_alpha\":1.0,\"line_color\":\"black\",\"line_dash\":[4,4],\"line_width\":2,\"right_units\":\"screen\",\"syncable\":false,\"top_units\":\"screen\"},\"id\":\"1363\",\"type\":\"BoxAnnotation\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"#1f77b4\"},\"hatch_alpha\":{\"value\":0.1},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#1f77b4\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y1\"}},\"id\":\"1372\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1327\",\"type\":\"HelpTool\"},{\"attributes\":{\"fill_color\":{\"value\":\"#1f77b4\"},\"line_color\":{\"value\":\"#1f77b4\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y0\"}},\"id\":\"1337\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1396\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1328\",\"type\":\"ResetTool\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1307\"},\"glyph\":{\"id\":\"1371\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1373\"},\"nonselection_glyph\":{\"id\":\"1372\"},\"view\":{\"id\":\"1375\"}},\"id\":\"1374\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1385\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"1309\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1311\",\"type\":\"DataRange1d\"},{\"attributes\":{\"source\":{\"id\":\"1307\"}},\"id\":\"1341\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1356\",\"type\":\"BasicTicker\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1392\"},\"group\":null,\"major_label_policy\":{\"id\":\"1393\"},\"ticker\":{\"id\":\"1356\"}},\"id\":\"1355\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1347\",\"type\":\"LinearScale\"},{\"attributes\":{\"coordinates\":null,\"fill_alpha\":0.5,\"fill_color\":\"lightgrey\",\"group\":null,\"level\":\"overlay\",\"line_alpha\":1.0,\"line_color\":\"black\",\"line_dash\":[4,4],\"line_width\":2,\"syncable\":false,\"xs_units\":\"screen\",\"ys_units\":\"screen\"},\"id\":\"1364\",\"type\":\"PolyAnnotation\"},{\"attributes\":{\"fill_color\":{\"value\":\"#1f77b4\"},\"line_color\":{\"value\":\"#1f77b4\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y1\"}},\"id\":\"1371\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1392\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1349\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1318\",\"type\":\"BasicTicker\"},{\"attributes\":{\"source\":{\"id\":\"1307\"}},\"id\":\"1375\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1343\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1313\",\"type\":\"LinearScale\"},{\"attributes\":{\"coordinates\":null,\"group\":null},\"id\":\"1389\",\"type\":\"Title\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"#1f77b4\"},\"hatch_alpha\":{\"value\":0.1},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#1f77b4\"},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y0\"}},\"id\":\"1338\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1315\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1395\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"axis\":{\"id\":\"1355\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1358\",\"type\":\"Grid\"},{\"attributes\":{\"tools\":[{\"id\":\"1325\"},{\"id\":\"1326\"},{\"id\":\"1327\"},{\"id\":\"1328\"}]},\"id\":\"1331\",\"type\":\"Toolbar\"}],\"root_ids\":[\"1405\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n",
507
+ " const render_items = [{\"docid\":\"ac0f847d-4cf4-4e37-a5ef-fea3652049c2\",\"root_ids\":[\"1405\"],\"roots\":{\"1405\":\"ded72a6f-e361-48c0-9c62-52ad12e55591\"}}];\n",
508
+ " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
509
+ " }\n",
510
+ " if (root.Bokeh !== undefined) {\n",
511
+ " embed_document(root);\n",
512
+ " } else {\n",
513
+ " let attempts = 0;\n",
514
+ " const timer = setInterval(function(root) {\n",
515
+ " if (root.Bokeh !== undefined) {\n",
516
+ " clearInterval(timer);\n",
517
+ " embed_document(root);\n",
518
+ " } else {\n",
519
+ " attempts++;\n",
520
+ " if (attempts > 100) {\n",
521
+ " clearInterval(timer);\n",
522
+ " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
523
+ " }\n",
524
+ " }\n",
525
+ " }, 10, root)\n",
526
+ " }\n",
527
+ "})(window);"
528
+ ],
529
+ "application/vnd.bokehjs_exec.v0+json": ""
530
+ },
531
+ "metadata": {
532
+ "application/vnd.bokehjs_exec.v0+json": {
533
+ "id": "1405"
534
+ }
535
+ },
536
+ "output_type": "display_data"
537
+ }
538
+ ],
539
+ "source": [
540
+ "x = list(range(-20, 21))\n",
541
+ "y0, y1 = [abs(xx) for xx in x], [xx**2 for xx in x]\n",
542
+ "\n",
543
+ "# create a column data source for the plots to share\n",
544
+ "source = ColumnDataSource(\n",
545
+ " data=dict(\n",
546
+ " x=x,\n",
547
+ " y0=y0,\n",
548
+ " y1=y1\n",
549
+ " )\n",
550
+ ")\n",
551
+ "\n",
552
+ "TOOLS = \"box_select, lasso_select, help, reset\"\n",
553
+ "\n",
554
+ "# create a new plot and add a renderer\n",
555
+ "left = figure(\n",
556
+ " width=400,\n",
557
+ " height=300,\n",
558
+ " tools=TOOLS\n",
559
+ ")\n",
560
+ "left.circle(\n",
561
+ " 'x',\n",
562
+ " 'y0',\n",
563
+ " source=source\n",
564
+ ")\n",
565
+ "\n",
566
+ "# create another new plot and add a renderer\n",
567
+ "right = figure(\n",
568
+ " width=400,\n",
569
+ " height=300,\n",
570
+ " tools=TOOLS\n",
571
+ ")\n",
572
+ "right.circle(\n",
573
+ " 'x',\n",
574
+ " 'y1',\n",
575
+ " source=source\n",
576
+ ")\n",
577
+ "\n",
578
+ "p = gridplot(\n",
579
+ " [[left, right]]\n",
580
+ ")\n",
581
+ "\n",
582
+ "# show the results\n",
583
+ "show(p)"
584
+ ]
585
+ },
586
+ {
587
+ "cell_type": "markdown",
588
+ "metadata": {},
589
+ "source": [
590
+ "### Hover Tools\n",
591
+ "\n",
592
+ "Bokeh has a Hover Tool that allows additional information to be displayed in a popup whenever the user hovers over a specific glyph. Basic hover tool configuration amounts to providing a list of ``(name, format)`` tuples. The full details can be found in the User's Guide [here](https://bokeh.pydata.org/en/latest/docs/user_guide/tools.html#hovertool). \n",
593
+ "The example below shows some basic usage of the Hover tool with a circle glyph, using hover information defined in utils.py:"
594
+ ]
595
+ },
596
+ {
597
+ "cell_type": "code",
598
+ "execution_count": 7,
599
+ "metadata": {},
600
+ "outputs": [],
601
+ "source": [
602
+ "# from bokeh.models import HoverTool"
603
+ ]
604
+ },
605
+ {
606
+ "cell_type": "code",
607
+ "execution_count": 8,
608
+ "metadata": {},
609
+ "outputs": [
610
+ {
611
+ "data": {
612
+ "text/html": [
613
+ "\n",
614
+ " <div class=\"bk-root\" id=\"a2e0cfa6-7d08-479c-934e-0c4f1fd1766e\" data-root-id=\"1570\"></div>\n"
615
+ ]
616
+ },
617
+ "metadata": {},
618
+ "output_type": "display_data"
619
+ },
620
+ {
621
+ "data": {
622
+ "application/javascript": [
623
+ "(function(root) {\n",
624
+ " function embed_document(root) {\n",
625
+ " const docs_json = {\"79ce7deb-49c3-48cd-8a0e-69e9a2868047\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1581\"}],\"center\":[{\"id\":\"1584\"},{\"id\":\"1588\"}],\"height\":300,\"left\":[{\"id\":\"1585\"}],\"renderers\":[{\"id\":\"1595\"}],\"title\":{\"id\":\"1571\"},\"toolbar\":{\"id\":\"1589\"},\"width\":800,\"x_range\":{\"id\":\"1573\"},\"x_scale\":{\"id\":\"1577\"},\"y_range\":{\"id\":\"1575\"},\"y_scale\":{\"id\":\"1579\"}},\"id\":\"1570\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"1573\",\"type\":\"DataRange1d\"},{\"attributes\":{\"source\":{\"id\":\"1568\"}},\"id\":\"1596\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1654\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"tools\":[{\"id\":\"1569\"}]},\"id\":\"1589\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"1575\",\"type\":\"DataRange1d\"},{\"attributes\":{\"coordinates\":null,\"group\":null,\"text\":\"Mouse over the dots\"},\"id\":\"1571\",\"type\":\"Title\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1568\"},\"glyph\":{\"id\":\"1592\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1594\"},\"nonselection_glyph\":{\"id\":\"1593\"},\"view\":{\"id\":\"1596\"}},\"id\":\"1595\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1656\",\"type\":\"UnionRenderers\"},{\"attributes\":{},\"id\":\"1651\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1652\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1582\",\"type\":\"BasicTicker\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"#1f77b4\"},\"hatch_alpha\":{\"value\":0.1},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#1f77b4\"},\"size\":{\"value\":20},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1593\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1577\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1579\",\"type\":\"LinearScale\"},{\"attributes\":{\"fill_color\":{\"value\":\"#1f77b4\"},\"line_color\":{\"value\":\"#1f77b4\"},\"size\":{\"value\":20},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1592\",\"type\":\"Circle\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1654\"},\"group\":null,\"major_label_policy\":{\"id\":\"1655\"},\"ticker\":{\"id\":\"1582\"}},\"id\":\"1581\",\"type\":\"LinearAxis\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"#1f77b4\"},\"hatch_alpha\":{\"value\":0.2},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"#1f77b4\"},\"size\":{\"value\":20},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1594\",\"type\":\"Circle\"},{\"attributes\":{\"axis\":{\"id\":\"1581\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1584\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1586\",\"type\":\"BasicTicker\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1651\"},\"group\":null,\"major_label_policy\":{\"id\":\"1652\"},\"ticker\":{\"id\":\"1586\"}},\"id\":\"1585\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"1655\",\"type\":\"AllLabels\"},{\"attributes\":{\"callback\":null,\"tooltips\":[[\"index\",\"$index\"],[\"(x,y)\",\"($x, $y)\"],[\"desc\",\"@desc\"]]},\"id\":\"1569\",\"type\":\"HoverTool\"},{\"attributes\":{\"data\":{\"desc\":[\"A\",\"b\",\"C\",\"d\",\"E\"],\"x\":[1,2,3,4,5],\"y\":[2,5,8,2,7]},\"selected\":{\"id\":\"1657\"},\"selection_policy\":{\"id\":\"1656\"}},\"id\":\"1568\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"axis\":{\"id\":\"1585\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1588\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1657\",\"type\":\"Selection\"}],\"root_ids\":[\"1570\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n",
626
+ " const render_items = [{\"docid\":\"79ce7deb-49c3-48cd-8a0e-69e9a2868047\",\"root_ids\":[\"1570\"],\"roots\":{\"1570\":\"a2e0cfa6-7d08-479c-934e-0c4f1fd1766e\"}}];\n",
627
+ " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
628
+ " }\n",
629
+ " if (root.Bokeh !== undefined) {\n",
630
+ " embed_document(root);\n",
631
+ " } else {\n",
632
+ " let attempts = 0;\n",
633
+ " const timer = setInterval(function(root) {\n",
634
+ " if (root.Bokeh !== undefined) {\n",
635
+ " clearInterval(timer);\n",
636
+ " embed_document(root);\n",
637
+ " } else {\n",
638
+ " attempts++;\n",
639
+ " if (attempts > 100) {\n",
640
+ " clearInterval(timer);\n",
641
+ " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
642
+ " }\n",
643
+ " }\n",
644
+ " }, 10, root)\n",
645
+ " }\n",
646
+ "})(window);"
647
+ ],
648
+ "application/vnd.bokehjs_exec.v0+json": ""
649
+ },
650
+ "metadata": {
651
+ "application/vnd.bokehjs_exec.v0+json": {
652
+ "id": "1570"
653
+ }
654
+ },
655
+ "output_type": "display_data"
656
+ }
657
+ ],
658
+ "source": [
659
+ "source = ColumnDataSource(\n",
660
+ " data=dict(\n",
661
+ " x=[1, 2, 3, 4, 5],\n",
662
+ " y=[2, 5, 8, 2, 7],\n",
663
+ " desc=['A', 'b', 'C', 'd', 'E'],\n",
664
+ " )\n",
665
+ ")\n",
666
+ "\n",
667
+ "hover = HoverTool( \n",
668
+ " tooltips=[\n",
669
+ " (\"index\", \"$index\"),\n",
670
+ " (\"(x,y)\", \"($x, $y)\"),\n",
671
+ " (\"desc\", \"@desc\"),\n",
672
+ " ]\n",
673
+ ")\n",
674
+ "\n",
675
+ "p = figure(\n",
676
+ " plot_height=300,\n",
677
+ " plot_width=800,\n",
678
+ " tools=[hover],\n",
679
+ " title=\"Mouse over the dots\"\n",
680
+ ")\n",
681
+ "\n",
682
+ "p.circle(\n",
683
+ " 'x',\n",
684
+ " 'y',\n",
685
+ " size=20,\n",
686
+ " source=source\n",
687
+ ")\n",
688
+ "\n",
689
+ "# show the results\n",
690
+ "show(p)"
691
+ ]
692
+ },
693
+ {
694
+ "cell_type": "markdown",
695
+ "metadata": {},
696
+ "source": [
697
+ "### Widgets"
698
+ ]
699
+ },
700
+ {
701
+ "cell_type": "markdown",
702
+ "metadata": {},
703
+ "source": [
704
+ "Bokeh supports direct integration with a small basic widget set. These can be used in conjunction with a Bokeh Server, or with ``CustomJS`` models to add more interactive capability to your documents. You can see a complete list, with example code in the [Adding Widgets](https://bokeh.pydata.org/en/latest/docs/user_guide/interaction.html#adding-widgets) section of the User's Guide. \n",
705
+ "\n",
706
+ "\n",
707
+ "\n",
708
+ "*NOTE: In this Tutorial chapter, we will focus on using widgets with JavaScript callbacks. The Tutorial chapter on Bokeh server applications covers using Bokeh widgets with real Python callbacks*\n",
709
+ "\n",
710
+ "\n",
711
+ "\n",
712
+ "\n",
713
+ "To use the widgets, include them in a layout like you would a plot object:"
714
+ ]
715
+ },
716
+ {
717
+ "cell_type": "code",
718
+ "execution_count": 9,
719
+ "metadata": {},
720
+ "outputs": [],
721
+ "source": [
722
+ "# from bokeh.models.widgets import Slider"
723
+ ]
724
+ },
725
+ {
726
+ "cell_type": "code",
727
+ "execution_count": 10,
728
+ "metadata": {},
729
+ "outputs": [
730
+ {
731
+ "data": {
732
+ "text/html": [
733
+ "\n",
734
+ " <div class=\"bk-root\" id=\"ae094e54-9404-45c7-8a33-c8b405b924ab\" data-root-id=\"1703\"></div>\n"
735
+ ]
736
+ },
737
+ "metadata": {},
738
+ "output_type": "display_data"
739
+ },
740
+ {
741
+ "data": {
742
+ "application/javascript": [
743
+ "(function(root) {\n",
744
+ " function embed_document(root) {\n",
745
+ " const docs_json = {\"e56d704a-17e3-456d-b9df-2a6aa20d67b3\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"end\":10,\"start\":0,\"step\":0.1,\"title\":\"Slider, value\",\"value\":1},\"id\":\"1703\",\"type\":\"Slider\"}],\"root_ids\":[\"1703\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n",
746
+ " const render_items = [{\"docid\":\"e56d704a-17e3-456d-b9df-2a6aa20d67b3\",\"root_ids\":[\"1703\"],\"roots\":{\"1703\":\"ae094e54-9404-45c7-8a33-c8b405b924ab\"}}];\n",
747
+ " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
748
+ " }\n",
749
+ " if (root.Bokeh !== undefined) {\n",
750
+ " embed_document(root);\n",
751
+ " } else {\n",
752
+ " let attempts = 0;\n",
753
+ " const timer = setInterval(function(root) {\n",
754
+ " if (root.Bokeh !== undefined) {\n",
755
+ " clearInterval(timer);\n",
756
+ " embed_document(root);\n",
757
+ " } else {\n",
758
+ " attempts++;\n",
759
+ " if (attempts > 100) {\n",
760
+ " clearInterval(timer);\n",
761
+ " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
762
+ " }\n",
763
+ " }\n",
764
+ " }, 10, root)\n",
765
+ " }\n",
766
+ "})(window);"
767
+ ],
768
+ "application/vnd.bokehjs_exec.v0+json": ""
769
+ },
770
+ "metadata": {
771
+ "application/vnd.bokehjs_exec.v0+json": {
772
+ "id": "1703"
773
+ }
774
+ },
775
+ "output_type": "display_data"
776
+ }
777
+ ],
778
+ "source": [
779
+ "slider = Slider(\n",
780
+ " start=0,\n",
781
+ " end=10,\n",
782
+ " value=1,\n",
783
+ " step=.1,\n",
784
+ " title=\"Slider, value\")\n",
785
+ "\n",
786
+ "show(slider)"
787
+ ]
788
+ },
789
+ {
790
+ "cell_type": "markdown",
791
+ "metadata": {},
792
+ "source": [
793
+ "### CustomJS Callbacks\n",
794
+ "\n",
795
+ "In order for a widget to be useful, it needs to be able to perform some action. Using the Bokeh server, it is possible to have widgets trigger real Python code. That possibility will be explored in the Bokeh server chapter of the tutorial. Here, we look at how widgets can be configured with `CustomJS` callbacks that execute snippets of JavaScript code. "
796
+ ]
797
+ },
798
+ {
799
+ "cell_type": "code",
800
+ "execution_count": 11,
801
+ "metadata": {},
802
+ "outputs": [],
803
+ "source": [
804
+ "# from bokeh.models import TapTool, CustomJS, ColumnDataSource"
805
+ ]
806
+ },
807
+ {
808
+ "cell_type": "code",
809
+ "execution_count": 12,
810
+ "metadata": {},
811
+ "outputs": [
812
+ {
813
+ "data": {
814
+ "text/html": [
815
+ "\n",
816
+ " <div class=\"bk-root\" id=\"4564b7d9-0ce2-4120-ba34-336b74bae937\" data-root-id=\"1767\"></div>\n"
817
+ ]
818
+ },
819
+ "metadata": {},
820
+ "output_type": "display_data"
821
+ },
822
+ {
823
+ "data": {
824
+ "application/javascript": [
825
+ "(function(root) {\n",
826
+ " function embed_document(root) {\n",
827
+ " const docs_json = {\"5eab54ad-792e-4bf2-93e7-a75a5333c994\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"1776\"}],\"center\":[{\"id\":\"1779\"},{\"id\":\"1783\"}],\"height\":400,\"left\":[{\"id\":\"1780\"}],\"renderers\":[{\"id\":\"1792\"}],\"title\":{\"id\":\"1855\"},\"toolbar\":{\"id\":\"1785\"},\"width\":800,\"x_range\":{\"id\":\"1768\"},\"x_scale\":{\"id\":\"1772\"},\"y_range\":{\"id\":\"1770\"},\"y_scale\":{\"id\":\"1774\"}},\"id\":\"1767\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"1784\",\"type\":\"ResetTool\"},{\"attributes\":{},\"id\":\"1858\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"coordinates\":null,\"group\":null},\"id\":\"1855\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"1768\",\"type\":\"DataRange1d\"},{\"attributes\":{\"code\":\"alert('you tapped a circle!')\"},\"id\":\"1765\",\"type\":\"CustomJS\"},{\"attributes\":{\"tools\":[{\"id\":\"1766\"},{\"id\":\"1784\"}]},\"id\":\"1785\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"1770\",\"type\":\"DataRange1d\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"#1f77b4\"},\"hatch_alpha\":{\"value\":0.2},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":\"#1f77b4\"},\"size\":{\"value\":20},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1791\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1861\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1859\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1777\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"1864\",\"type\":\"Selection\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1788\"},\"glyph\":{\"id\":\"1789\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1791\"},\"nonselection_glyph\":{\"id\":\"1790\"},\"view\":{\"id\":\"1793\"}},\"id\":\"1792\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"1772\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"1774\",\"type\":\"LinearScale\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"value\":\"#1f77b4\"},\"hatch_alpha\":{\"value\":0.1},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"value\":\"#1f77b4\"},\"size\":{\"value\":20},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1790\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"1862\",\"type\":\"AllLabels\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1861\"},\"group\":null,\"major_label_policy\":{\"id\":\"1862\"},\"ticker\":{\"id\":\"1777\"}},\"id\":\"1776\",\"type\":\"LinearAxis\"},{\"attributes\":{\"axis\":{\"id\":\"1776\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1779\",\"type\":\"Grid\"},{\"attributes\":{\"source\":{\"id\":\"1788\"}},\"id\":\"1793\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"1781\",\"type\":\"BasicTicker\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"1858\"},\"group\":null,\"major_label_policy\":{\"id\":\"1859\"},\"ticker\":{\"id\":\"1781\"}},\"id\":\"1780\",\"type\":\"LinearAxis\"},{\"attributes\":{\"data\":{\"x\":[1,2,3,4,5],\"y\":[2,5,8,2,7]},\"selected\":{\"id\":\"1864\"},\"selection_policy\":{\"id\":\"1863\"}},\"id\":\"1788\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"callback\":{\"id\":\"1765\"}},\"id\":\"1766\",\"type\":\"TapTool\"},{\"attributes\":{},\"id\":\"1863\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"axis\":{\"id\":\"1780\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1783\",\"type\":\"Grid\"},{\"attributes\":{\"fill_color\":{\"value\":\"#1f77b4\"},\"line_color\":{\"value\":\"#1f77b4\"},\"size\":{\"value\":20},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1789\",\"type\":\"Circle\"}],\"root_ids\":[\"1767\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n",
828
+ " const render_items = [{\"docid\":\"5eab54ad-792e-4bf2-93e7-a75a5333c994\",\"root_ids\":[\"1767\"],\"roots\":{\"1767\":\"4564b7d9-0ce2-4120-ba34-336b74bae937\"}}];\n",
829
+ " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
830
+ " }\n",
831
+ " if (root.Bokeh !== undefined) {\n",
832
+ " embed_document(root);\n",
833
+ " } else {\n",
834
+ " let attempts = 0;\n",
835
+ " const timer = setInterval(function(root) {\n",
836
+ " if (root.Bokeh !== undefined) {\n",
837
+ " clearInterval(timer);\n",
838
+ " embed_document(root);\n",
839
+ " } else {\n",
840
+ " attempts++;\n",
841
+ " if (attempts > 100) {\n",
842
+ " clearInterval(timer);\n",
843
+ " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
844
+ " }\n",
845
+ " }\n",
846
+ " }, 10, root)\n",
847
+ " }\n",
848
+ "})(window);"
849
+ ],
850
+ "application/vnd.bokehjs_exec.v0+json": ""
851
+ },
852
+ "metadata": {
853
+ "application/vnd.bokehjs_exec.v0+json": {
854
+ "id": "1767"
855
+ }
856
+ },
857
+ "output_type": "display_data"
858
+ }
859
+ ],
860
+ "source": [
861
+ "callback = CustomJS(\n",
862
+ " code=\"alert('you tapped a circle!')\"\n",
863
+ ")\n",
864
+ "\n",
865
+ "tap = TapTool( \n",
866
+ " callback=callback\n",
867
+ ")\n",
868
+ "\n",
869
+ "p = figure(\n",
870
+ " plot_height=400,\n",
871
+ " plot_width=800,\n",
872
+ " tools=[tap, \"reset\"]\n",
873
+ ")\n",
874
+ "\n",
875
+ "p.circle(\n",
876
+ " x=[1, 2, 3, 4, 5],\n",
877
+ " y=[2, 5, 8, 2, 7],\n",
878
+ " size=20\n",
879
+ ")\n",
880
+ "\n",
881
+ "# show the results\n",
882
+ "show(p)"
883
+ ]
884
+ },
885
+ {
886
+ "cell_type": "markdown",
887
+ "metadata": {},
888
+ "source": [
889
+ "Bokeh objects that have values associated can have small JavaScript actions attached to them using the `js_on_change` method. These actions (also referred to as \"callbacks\") are executed whenever the widget's value is changed. In order to make it easier to refer to specific Bokeh models (e.g., a data source, or a glyph) from JavaScript, the ``CustomJS`` object also accepts a dictionary of \"args\" that map names to Python Bokeh models. The corresponding JavaScript models are made available automatically to the ``CustomJS`` code:\n",
890
+ "\n",
891
+ "```python\n",
892
+ "CustomJS(\n",
893
+ " args=dict(\n",
894
+ " source=source,\n",
895
+ " slider=slider\n",
896
+ " ),\n",
897
+ " code=\"\"\"\n",
898
+ " // easily refer to BokehJS source and slider objects in this JS code\n",
899
+ " var data = source.data;\n",
900
+ " var f = slider.value;\n",
901
+ " \"\"\"\n",
902
+ ")\n",
903
+ "```"
904
+ ]
905
+ },
906
+ {
907
+ "cell_type": "markdown",
908
+ "metadata": {},
909
+ "source": [
910
+ "#### Slider widget example\n",
911
+ "\n",
912
+ "The example below shows an action attached to a slider that updates a data source whenever the slider is moved. "
913
+ ]
914
+ },
915
+ {
916
+ "cell_type": "code",
917
+ "execution_count": 13,
918
+ "metadata": {},
919
+ "outputs": [],
920
+ "source": [
921
+ "# from bokeh.layouts import column\n",
922
+ "# from bokeh.models import CustomJS, ColumnDataSource, Slider"
923
+ ]
924
+ },
925
+ {
926
+ "cell_type": "code",
927
+ "execution_count": 14,
928
+ "metadata": {},
929
+ "outputs": [
930
+ {
931
+ "data": {
932
+ "text/html": [
933
+ "\n",
934
+ " <div class=\"bk-root\" id=\"bcc043a5-88fa-4c23-a27e-ed397c54add0\" data-root-id=\"1955\"></div>\n"
935
+ ]
936
+ },
937
+ "metadata": {},
938
+ "output_type": "display_data"
939
+ },
940
+ {
941
+ "data": {
942
+ "application/javascript": [
943
+ "(function(root) {\n",
944
+ " function embed_document(root) {\n",
945
+ " const docs_json = {\"3a0c7ddb-44e9-4d8f-8c1a-ce2d1278d472\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"children\":[{\"id\":\"1953\"},{\"id\":\"1916\"}]},\"id\":\"1955\",\"type\":\"Column\"},{\"attributes\":{\"axis\":{\"id\":\"1925\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"1928\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"1930\",\"type\":\"BasicTicker\"},{\"attributes\":{\"tools\":[{\"id\":\"1933\"},{\"id\":\"1934\"},{\"id\":\"1935\"},{\"id\":\"1936\"},{\"id\":\"1937\"},{\"id\":\"1938\"}]},\"id\":\"1940\",\"type\":\"Toolbar\"},{\"attributes\":{},\"id\":\"1926\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"2030\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"1921\",\"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\":\"1939\",\"type\":\"BoxAnnotation\"},{\"attributes\":{},\"id\":\"1923\",\"type\":\"LinearScale\"},{\"attributes\":{\"coordinates\":null,\"group\":null},\"id\":\"2027\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"2031\",\"type\":\"AllLabels\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"2033\"},\"group\":null,\"major_label_policy\":{\"id\":\"2034\"},\"ticker\":{\"id\":\"1926\"}},\"id\":\"1925\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"2034\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"1936\",\"type\":\"SaveTool\"},{\"attributes\":{},\"id\":\"2033\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"axis\":{\"id\":\"1929\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"1932\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"2035\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"1915\"},\"glyph\":{\"id\":\"1948\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"1950\"},\"nonselection_glyph\":{\"id\":\"1949\"},\"view\":{\"id\":\"1952\"}},\"id\":\"1951\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"line_alpha\":0.6,\"line_color\":\"#1f77b4\",\"line_width\":3,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1948\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"1933\",\"type\":\"PanTool\"},{\"attributes\":{},\"id\":\"2036\",\"type\":\"Selection\"},{\"attributes\":{\"end\":6,\"js_property_callbacks\":{\"change:value\":[{\"id\":\"1954\"}]},\"start\":0.1,\"step\":0.1,\"title\":\"Power, value\",\"value\":1},\"id\":\"1953\",\"type\":\"Slider\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"2030\"},\"group\":null,\"major_label_policy\":{\"id\":\"2031\"},\"ticker\":{\"id\":\"1930\"}},\"id\":\"1929\",\"type\":\"LinearAxis\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"#1f77b4\",\"line_width\":3,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1949\",\"type\":\"Line\"},{\"attributes\":{\"args\":{\"slider\":{\"id\":\"1953\"},\"source\":{\"id\":\"1915\"}},\"code\":\"\\n var data = source.data;\\n var f = slider.value;\\n var x = data['x']\\n var y = data['y']\\n for (var i = 0; i < x.length; i++) {\\n y[i] = Math.pow(x[i], f)\\n }\\n \\n // necessary becasue we mutated source.data in-place\\n source.change.emit();\\n \"},\"id\":\"1954\",\"type\":\"CustomJS\"},{\"attributes\":{\"data\":{\"x\":[0.0,0.005,0.01,0.015,0.02,0.025,0.03,0.035,0.04,0.045,0.05,0.055,0.06,0.065,0.07,0.075,0.08,0.085,0.09,0.095,0.1,0.105,0.11,0.115,0.12,0.125,0.13,0.135,0.14,0.145,0.15,0.155,0.16,0.165,0.17,0.17500000000000002,0.18,0.185,0.19,0.195,0.2,0.20500000000000002,0.21,0.215,0.22,0.225,0.23,0.23500000000000001,0.24,0.245,0.25,0.255,0.26,0.265,0.27,0.275,0.28,0.28500000000000003,0.29,0.295,0.3,0.305,0.31,0.315,0.32,0.325,0.33,0.335,0.34,0.34500000000000003,0.35000000000000003,0.355,0.36,0.365,0.37,0.375,0.38,0.385,0.39,0.395,0.4,0.405,0.41000000000000003,0.41500000000000004,0.42,0.425,0.43,0.435,0.44,0.445,0.45,0.455,0.46,0.465,0.47000000000000003,0.47500000000000003,0.48,0.485,0.49,0.495,0.5,0.505,0.51,0.515,0.52,0.525,0.53,0.535,0.54,0.545,0.55,0.555,0.56,0.5650000000000001,0.5700000000000001,0.5750000000000001,0.58,0.585,0.59,0.595,0.6,0.605,0.61,0.615,0.62,0.625,0.63,0.635,0.64,0.645,0.65,0.655,0.66,0.665,0.67,0.675,0.68,0.685,0.6900000000000001,0.6950000000000001,0.7000000000000001,0.705,0.71,0.715,0.72,0.725,0.73,0.735,0.74,0.745,0.75,0.755,0.76,0.765,0.77,0.775,0.78,0.785,0.79,0.795,0.8,0.805,0.81,0.8150000000000001,0.8200000000000001,0.8250000000000001,0.8300000000000001,0.835,0.84,0.845,0.85,0.855,0.86,0.865,0.87,0.875,0.88,0.885,0.89,0.895,0.9,0.905,0.91,0.915,0.92,0.925,0.93,0.935,0.9400000000000001,0.9450000000000001,0.9500000000000001,0.9550000000000001,0.96,0.965,0.97,0.975,0.98,0.985,0.99,0.995,1.0],\"y\":[0.0,0.005,0.01,0.015,0.02,0.025,0.03,0.035,0.04,0.045,0.05,0.055,0.06,0.065,0.07,0.075,0.08,0.085,0.09,0.095,0.1,0.105,0.11,0.115,0.12,0.125,0.13,0.135,0.14,0.145,0.15,0.155,0.16,0.165,0.17,0.17500000000000002,0.18,0.185,0.19,0.195,0.2,0.20500000000000002,0.21,0.215,0.22,0.225,0.23,0.23500000000000001,0.24,0.245,0.25,0.255,0.26,0.265,0.27,0.275,0.28,0.28500000000000003,0.29,0.295,0.3,0.305,0.31,0.315,0.32,0.325,0.33,0.335,0.34,0.34500000000000003,0.35000000000000003,0.355,0.36,0.365,0.37,0.375,0.38,0.385,0.39,0.395,0.4,0.405,0.41000000000000003,0.41500000000000004,0.42,0.425,0.43,0.435,0.44,0.445,0.45,0.455,0.46,0.465,0.47000000000000003,0.47500000000000003,0.48,0.485,0.49,0.495,0.5,0.505,0.51,0.515,0.52,0.525,0.53,0.535,0.54,0.545,0.55,0.555,0.56,0.5650000000000001,0.5700000000000001,0.5750000000000001,0.58,0.585,0.59,0.595,0.6,0.605,0.61,0.615,0.62,0.625,0.63,0.635,0.64,0.645,0.65,0.655,0.66,0.665,0.67,0.675,0.68,0.685,0.6900000000000001,0.6950000000000001,0.7000000000000001,0.705,0.71,0.715,0.72,0.725,0.73,0.735,0.74,0.745,0.75,0.755,0.76,0.765,0.77,0.775,0.78,0.785,0.79,0.795,0.8,0.805,0.81,0.8150000000000001,0.8200000000000001,0.8250000000000001,0.8300000000000001,0.835,0.84,0.845,0.85,0.855,0.86,0.865,0.87,0.875,0.88,0.885,0.89,0.895,0.9,0.905,0.91,0.915,0.92,0.925,0.93,0.935,0.9400000000000001,0.9450000000000001,0.9500000000000001,0.9550000000000001,0.96,0.965,0.97,0.975,0.98,0.985,0.99,0.995,1.0]},\"selected\":{\"id\":\"2036\"},\"selection_policy\":{\"id\":\"2035\"}},\"id\":\"1915\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"below\":[{\"id\":\"1925\"}],\"center\":[{\"id\":\"1928\"},{\"id\":\"1932\"}],\"height\":400,\"left\":[{\"id\":\"1929\"}],\"renderers\":[{\"id\":\"1951\"}],\"title\":{\"id\":\"2027\"},\"toolbar\":{\"id\":\"1940\"},\"width\":800,\"x_range\":{\"id\":\"1917\"},\"x_scale\":{\"id\":\"1921\"},\"y_range\":{\"id\":\"1919\"},\"y_scale\":{\"id\":\"1923\"}},\"id\":\"1916\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{},\"id\":\"1919\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1934\",\"type\":\"WheelZoomTool\"},{\"attributes\":{},\"id\":\"1937\",\"type\":\"ResetTool\"},{\"attributes\":{\"overlay\":{\"id\":\"1939\"}},\"id\":\"1935\",\"type\":\"BoxZoomTool\"},{\"attributes\":{},\"id\":\"1917\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"1938\",\"type\":\"HelpTool\"},{\"attributes\":{\"source\":{\"id\":\"1915\"}},\"id\":\"1952\",\"type\":\"CDSView\"},{\"attributes\":{\"line_alpha\":0.2,\"line_color\":\"#1f77b4\",\"line_width\":3,\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"1950\",\"type\":\"Line\"}],\"root_ids\":[\"1955\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n",
946
+ " const render_items = [{\"docid\":\"3a0c7ddb-44e9-4d8f-8c1a-ce2d1278d472\",\"root_ids\":[\"1955\"],\"roots\":{\"1955\":\"bcc043a5-88fa-4c23-a27e-ed397c54add0\"}}];\n",
947
+ " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
948
+ " }\n",
949
+ " if (root.Bokeh !== undefined) {\n",
950
+ " embed_document(root);\n",
951
+ " } else {\n",
952
+ " let attempts = 0;\n",
953
+ " const timer = setInterval(function(root) {\n",
954
+ " if (root.Bokeh !== undefined) {\n",
955
+ " clearInterval(timer);\n",
956
+ " embed_document(root);\n",
957
+ " } else {\n",
958
+ " attempts++;\n",
959
+ " if (attempts > 100) {\n",
960
+ " clearInterval(timer);\n",
961
+ " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
962
+ " }\n",
963
+ " }\n",
964
+ " }, 10, root)\n",
965
+ " }\n",
966
+ "})(window);"
967
+ ],
968
+ "application/vnd.bokehjs_exec.v0+json": ""
969
+ },
970
+ "metadata": {
971
+ "application/vnd.bokehjs_exec.v0+json": {
972
+ "id": "1955"
973
+ }
974
+ },
975
+ "output_type": "display_data"
976
+ }
977
+ ],
978
+ "source": [
979
+ "x = [x*0.005 for x in range(0, 201)]\n",
980
+ "\n",
981
+ "source = ColumnDataSource(\n",
982
+ " data=dict(x=x, y=x)\n",
983
+ ")\n",
984
+ "\n",
985
+ "# create a new plot using figure\n",
986
+ "plot = figure(\n",
987
+ " plot_height=400,\n",
988
+ " plot_width=800\n",
989
+ ")\n",
990
+ "\n",
991
+ "plot.line(\n",
992
+ " 'x',\n",
993
+ " 'y',\n",
994
+ " line_width=3,\n",
995
+ " line_alpha=0.6,\n",
996
+ " source=source\n",
997
+ ")\n",
998
+ "\n",
999
+ "slider = Slider(\n",
1000
+ " start=0.1,\n",
1001
+ " end=6,\n",
1002
+ " value=1,\n",
1003
+ " step=.1,\n",
1004
+ " title=\"Power, value\"\n",
1005
+ ")\n",
1006
+ "\n",
1007
+ "update_curve = CustomJS(\n",
1008
+ " args=dict(\n",
1009
+ " source=source,\n",
1010
+ " slider=slider\n",
1011
+ " ),\n",
1012
+ " code=\"\"\"\n",
1013
+ " var data = source.data;\n",
1014
+ " var f = slider.value;\n",
1015
+ " var x = data['x']\n",
1016
+ " var y = data['y']\n",
1017
+ " for (var i = 0; i < x.length; i++) {\n",
1018
+ " y[i] = Math.pow(x[i], f)\n",
1019
+ " }\n",
1020
+ " \n",
1021
+ " // necessary becasue we mutated source.data in-place\n",
1022
+ " source.change.emit();\n",
1023
+ " \"\"\"\n",
1024
+ ")\n",
1025
+ "slider.js_on_change(\n",
1026
+ " 'value',\n",
1027
+ " update_curve\n",
1028
+ ")\n",
1029
+ "\n",
1030
+ "# show the results\n",
1031
+ "show(\n",
1032
+ " column(\n",
1033
+ " slider,\n",
1034
+ " plot\n",
1035
+ " )\n",
1036
+ ")"
1037
+ ]
1038
+ },
1039
+ {
1040
+ "cell_type": "markdown",
1041
+ "metadata": {},
1042
+ "source": [
1043
+ "#### Data selection example\n",
1044
+ "\n",
1045
+ "It's also possible to make JavaScript actions that execute whenever a user selection (e.g., box, point, lasso) changes. This is done by attaching the same kind of CustomJS object to whatever data source the selection is made on. The example below is a bit more sophisticated, and demonstrates updating one glyph's data source in response to another glyph's selection: "
1046
+ ]
1047
+ },
1048
+ {
1049
+ "cell_type": "code",
1050
+ "execution_count": 15,
1051
+ "metadata": {},
1052
+ "outputs": [],
1053
+ "source": [
1054
+ "# from random import random"
1055
+ ]
1056
+ },
1057
+ {
1058
+ "cell_type": "code",
1059
+ "execution_count": 16,
1060
+ "metadata": {},
1061
+ "outputs": [
1062
+ {
1063
+ "data": {
1064
+ "text/html": [
1065
+ "\n",
1066
+ " <div class=\"bk-root\" id=\"359df0da-6388-4e41-9dcf-335776a4f4ca\" data-root-id=\"2093\"></div>\n"
1067
+ ]
1068
+ },
1069
+ "metadata": {},
1070
+ "output_type": "display_data"
1071
+ },
1072
+ {
1073
+ "data": {
1074
+ "application/javascript": [
1075
+ "(function(root) {\n",
1076
+ " function embed_document(root) {\n",
1077
+ " const docs_json = {\"a13a1f3a-afe1-4f20-8979-1a6f863b1f9a\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"below\":[{\"id\":\"2104\"}],\"center\":[{\"id\":\"2107\"},{\"id\":\"2111\"}],\"height\":400,\"left\":[{\"id\":\"2108\"}],\"renderers\":[{\"id\":\"2124\"},{\"id\":\"2131\"}],\"title\":{\"id\":\"2094\"},\"toolbar\":{\"id\":\"2115\"},\"width\":800,\"x_range\":{\"id\":\"2096\"},\"x_scale\":{\"id\":\"2100\"},\"y_range\":{\"id\":\"2098\"},\"y_scale\":{\"id\":\"2102\"}},\"id\":\"2093\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"js_property_callbacks\":{\"change:indices\":[{\"id\":\"2133\"}]}},\"id\":\"2134\",\"type\":\"Selection\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"2126\"},\"glyph\":{\"id\":\"2128\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"2130\"},\"nonselection_glyph\":{\"id\":\"2129\"},\"view\":{\"id\":\"2132\"}},\"id\":\"2131\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"coordinates\":null,\"group\":null,\"text\":\"Select Here\"},\"id\":\"2094\",\"type\":\"Title\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"2118\"},\"glyph\":{\"id\":\"2120\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"2123\"},\"nonselection_glyph\":{\"id\":\"2121\"},\"selection_glyph\":{\"id\":\"2122\"},\"view\":{\"id\":\"2125\"}},\"id\":\"2124\",\"type\":\"GlyphRenderer\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.1},\"fill_color\":{\"field\":\"color\"},\"hatch_alpha\":{\"value\":0.1},\"hatch_color\":{\"field\":\"color\"},\"line_alpha\":{\"value\":0.1},\"line_color\":{\"field\":\"color\"},\"size\":{\"value\":8},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2121\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"2098\",\"type\":\"DataRange1d\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.4},\"fill_color\":{\"value\":\"firebrick\"},\"hatch_alpha\":{\"value\":0.4},\"hatch_color\":{\"value\":\"firebrick\"},\"line_alpha\":{\"value\":0.4},\"line_color\":{\"value\":\"firebrick\"},\"size\":{\"value\":8},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2122\",\"type\":\"Circle\"},{\"attributes\":{\"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.6513069134361508,0.9302638487172461,0.7721872102808276,0.9678773312494243,0.932163584132042,0.3365191622702126,0.5160400764925743,0.507138567596086,0.7251433640012573,0.6340505520074777,0.08350102901396617,0.5987979437708557,0.7241408305187939,0.41835830994714884,0.14551743590571298,0.9442057416737993,0.23323480380339956,0.6433223706678678,0.5208283787638164,0.09750911862511247,0.5928571118838827,0.12928686714122184,0.9088153709157378,0.4317498816374309,0.10565721702704833,0.26113641713240354,0.7687580600418278,0.7415762653797624,0.0030631227064324973,0.9146812852397072,0.38926592666685,0.9865087662900418,0.6477680613756939,0.551334190194699,0.9702784641182961,0.21643061403900699,0.05886784775956411,0.3841471475700329,0.2677542443370017,0.1646742673288426,0.5043227445502076,0.1582565068262911,0.4198173190457968,0.6294068105999743,0.5666702747159812,0.2543486884254006,0.823514417408352,0.2542396406087897,0.13293613567929985,0.8275036410792899,0.014575960233486951,0.7850609311355264,0.12268409251780699,0.909190112332006,0.7833648465975313,0.15286083332465228,0.01687586389796203,0.5769130920857858,0.13145348394337664,0.6986549355971762,0.4601777944778377,0.28905777763421525,0.6413826005563983,0.8377672556271195,0.5995451442610692,0.28548917121289574,0.652774133561938,0.9874402796326494,0.8230496000475873,0.1207149921046311,0.7415864782263247,0.16679161274687482,0.5637296825580626,0.30137730457299583,0.31921137431430613,0.9066334811764953,0.02285764024395842,0.7690998270486483,0.19185593184800154,0.9249702307071073,0.24812085473883005,0.029486179709639848,0.6879101781169045,0.49149696795946385,0.3460194167702001,0.24467441945834412,0.7458736412055383,0.36282521284029146,0.22946278055738645,0.7516354446562389,0.7137002039871281,0.4930062036681646,0.2087408768245418,0.10163047259068991,0.891272355148203,0.9311417986678233,0.6229724477990332,0.5432798497595713,0.34232827024792434,0.3352953704492202,0.6792690040398256,0.7306533989082279,0.4004196369343742,0.8766568902225923,0.528806001907863,0.8173811121936724,0.2351103005782369,0.49042549807720903,0.6485874125333447,0.9763518274110026,0.881542458750507,0.5900664440143056,0.9944374427294452,0.855762460263826,0.11340549038747938,0.31596248774641655,0.41241695736870254,0.3031284647374888,0.7729362056223238,0.059885834252159875,0.31574241474376197,0.0006271680445302241,0.3462858703144511,0.5247356431062973,0.4669679755463487,0.04600357004447564,0.26417434792005945,0.30739082219444036,0.34962925561402347,0.45465506394595656,0.4797402622927506,0.1773172038443206,0.11444698838845868,0.41785257470418924,0.9922732296690892,0.6848241884314056,0.23385102692970483,0.8712247404427264,0.14783029899109412,0.960097045232122,0.45374638880562423,0.9252865132121151,0.16177502156540058,0.7524431289758342,0.2641434711048044,0.7546490829684227,0.822144931788902,0.9687813317290076,0.8402593529559509,0.3146091575057981,0.9202700814436755,0.4935808637986113,0.22419144701596505,0.7525974270735133,0.7580532257607637,0.49756581455213644,0.2734838935689837,0.8463394537992466,0.7023086183997727,0.6976284863099955,0.7434495344268065,0.8541624731795697,0.8454275152846888,0.6840378108102941,0.3056104521519929,0.013382878381923535,0.45426750812036276,0.5529588427260069,0.4379767092970772,0.720667042601621,0.25339672586281503,0.1397198939212173,0.9568800814828308,0.7848086553678164,0.40889455572781597,0.8793301343361523,0.12113501277830785,0.36220559360926463,0.3927438040412221,0.8109154161852445,0.9602727241091474,0.3257844090572525,0.07034471699924572,0.624186902441565,0.8379225735602048,0.8962411728603107,0.17325892636296647,0.5982500003039828,0.7174629865835963,0.2552578252581805,0.7209970868369583,0.1309128693805126,0.7408025902113183,0.07698456920120678,0.6615676550056455,0.45686229142834633,0.23252163462839426,0.31110924764234205,0.8592644823997827,0.7338988298663699,0.6944355887375703,0.5164794573212885,0.0023292749038691385,0.5863733747384501,0.8586493045359748,0.17181744805824783,0.7662053855206741,0.5205543328089937,0.2886319269587382,0.039159265880527316,0.6699985769514931,0.33464173778180395,0.8475645462733765,0.8164432101743232,0.7460104205939961,0.8228415432899626,0.6666882783596471,0.4991813434796585,0.1193608098665464,0.8686854618632796,0.05135940031202413,0.7825839783277178,0.8347964230460185,0.8908516436132061,0.11590791303081738,0.40100612430145544,0.34012798829410684,0.0639892002093636,0.6258700079340207,0.01859927167406683,0.5219032656294034,0.445797932345956,0.8121975145035341,0.6670153390964684,0.9503737433845734,0.3563195022320542,0.7058115094726762,0.6130699279268739,0.6593403273471008,0.12310703099591602,0.5384054949426623,0.7402810170498086,0.28845629791229777,0.5059752165100799,0.4859289815731448,0.07674806032186277,0.8870435298133093,0.5595847847428194,0.37802052442961065,0.59283340161219,0.19913810216440675,0.8641388291850305,0.22755330611752855,0.17927388939971212,0.8361093585286676,0.5533398972900012,0.45721267821785583,0.0021651744293812447,0.5461915118330215,0.588418753752303,0.25594309794134074,0.9827438965477356,0.9979988064727655,0.5123448781826578,0.18659148599996356,0.6463127039810092,0.5114980763768036,0.09065287032430469,0.34151153935908085,0.9230969149647601,0.5875769393422092,0.7333596366113998,0.8703193960337436,0.9588884231059444,0.7804185584645087,0.816006716840811,0.7141068651950212,0.7977153081700067,0.9878728975886831,0.17097467786399212,0.8524012208049875,0.8704473025854146,0.6416228266811501,0.9531685000787385,0.5905338315190413,0.5008146846716975,0.43728617222590627,0.5792930036272098,0.9654053716431956,0.16946936111345623,0.017431240701524575,0.8806118685819325,0.0968660635933195,0.0209827117303083,0.17665926908939844,0.6091521642671679,0.18910178520146192,0.6394268140518058,0.9361202450130377,0.9557586897276672,0.9727934311033734,0.27742466298072743,0.02898578241027694,0.23495577699996983,0.584546611050723,0.5564726567890119,0.504296719063104,0.6147033708347055,0.18479319521182658,0.4605701692545875,0.612805731180096,0.0457218655399777,0.3125397885629768,0.7208305356225218,0.9395168578075088,0.5266187851308798,0.4541759684464042,0.3693467414399503,0.2959320489161841,0.55409969088015,0.8488654601680939,0.44863365247070586,0.45072286179651344,0.04675565053856845,0.5312010815934662,0.6909668580696734,0.5503796170515132,0.5364023411427637,0.4022465010520585,0.37228338508791836,0.3092673291115705,0.7110430684974979,0.4209773031958629,0.9605096117044938,0.6565546367406684,0.9581066046736644,0.47086571781052267,0.30748525759647005,0.9693009944087112,0.09031580666464678,0.06875016295706116,0.16107560698154755,0.6361804319170127,0.9772476984319132,0.5766883825772631,0.631285501950893,0.2005222337089364,0.9720751697379882,0.7806816266390615,0.2632459562855173,0.7928265564041264,0.39966269912514485,0.45542360753361477,0.1439973879221228,0.012661954364194372,0.692650767988487,0.8819854675321309,0.25868377918262686,0.860500835027924,0.8388384965134495,0.8458636209471603,0.10764089729962889,0.5319865022232936,0.18140134080834258,0.7396152868173417,0.4882467385832465,0.5778821577766574,0.6088596098305882,0.12301292373223471,0.46801597523540106,0.027459737210553725,0.3283749207029666,0.4961356519430067,0.8465980813030154,0.27047941371581685,0.09075949174278419,0.3157737725580979,0.35619853484559294,0.38799749231289005,0.3404742382828372,0.005747538900962468,0.6716647253726235,0.5000097069777873,0.9635443487311711,0.855998744771076,0.858181774118718,0.709502267113809,0.10746004935123665,0.9769211057025867,0.07633966236106138,0.7645472529905423,0.37022732513268986,0.883495811100979,0.10487224446715382,0.15127108397909161,0.5245710776280044,0.8748998161504744,0.7688903603589363,0.22232807049806458,0.22274417952540893,0.17193012947073016,0.04907079707095097,0.6879293891398064,0.3852492682991524,0.4227760689497895,0.34466213339051455,0.15050873113258922,0.07366230390117923,0.10840224285561872,0.6427060768372084,0.41886953593461584,0.7482765367484947,0.6093680039393741,0.09587913786318392,0.2872606577256869,0.567811853039395,0.13284515689266174,0.7977070764434909,0.023946222199447198,0.3614271276042742,0.1843021049074296,0.2504217621603959,0.2675725132561294,0.7977959716852489,0.8029684130637609,0.8508756864629039,0.7694902198684411,0.4504096560641321,0.19463367696296086,0.8642761196199157,0.28681414979029773,0.8501058275832343,0.5338186996990525,0.18154373105652888,0.44371938906998754,0.8840997150104587,0.6773944918529774,0.23086280298350204,0.7888439104656292,0.5972887442486171,0.8795630452584428,0.8412405677190986,0.4975363007770628,0.8038383135986866,0.9831777920678633,0.4157420721321978,0.07498549194308868,0.13798051017890545,0.0988692409420956,0.7233254501489671,0.026206071243108475,0.6714607181807529,0.12279739728490768,0.4586648524310064,0.4877211776942537,0.4167472887518422,0.7359301707811334,0.8289905978795853,0.7440516622065456,0.7536889410853836,0.8404631513738618,0.06137495335813559,0.6710019963015977,0.8169851581622158,0.3040610239320347,0.7220881194049856,0.7185656450248067,0.8522037835726954,0.6065425361827227,0.38734366899908046,0.19476530203455455,0.1355173752646509,0.3437657520141869,0.42689155822364755,0.737259501647197,0.8046128818499482,0.06178431991845512,0.8777876118415705,0.21078704044336727,0.04859183811276613,0.05780538902503385,0.6390422910648276,0.9811913764446444,0.10458322996740577,0.8366930508605093,0.8346604736826548,0.9932517591358815,0.966281300162565,0.836424687448222,0.8656781118052231,0.9509412618507416,0.06858152576959209,0.9499886046350768,0.23058877354737517,0.8586048779841297,0.13369614316512368,0.3418616634498889,0.08511268362457114,0.52782925669614,0.32532303404549723],\"y\":[0.7706879326563791,0.5201036150020096,0.5419306801408689,0.48834627181019896,0.6715363484548056,0.9367918097926407,0.9654257066594676,0.7737611313604769,0.8425848421418576,0.16067735774862635,0.7886455388621515,0.5606516528217105,0.013380997710886744,0.7646733282819026,0.6548194502654692,0.709698713208151,0.16735683013749547,0.16628825452754536,0.6694752361236199,0.07539482261932995,0.6060649772301896,0.6905549207901502,0.28788165420545553,0.6271585287975526,0.49928799048347006,0.5189443708145665,0.428621878339453,0.10464791900183512,0.7680864132084703,0.23394795136645552,0.3385529925150973,0.735675656764826,0.1849234825993954,0.5187204809428785,0.9055896085606793,0.49766470550628494,0.5093534836572796,0.4189123643122147,0.8295555978153489,0.7316965752825211,0.1867749328289945,0.8441756612571456,0.14032930034034619,0.5266111503875264,0.4952939659940866,0.645736517010519,0.037157460128837916,0.6151862461939497,0.23561791180875846,0.8185725993063673,0.5258378740195462,0.07273941355258251,0.6454692161804773,0.12564840727744087,0.5528059492061111,0.21667807877662515,0.993549172421652,0.5085048159284044,0.297969067015626,0.23176455736512946,0.11387544545643102,0.5370038816795384,0.7201598661435976,0.755722100947745,0.18543118439275186,0.9962915240413148,0.5517257487486367,0.04808336541697522,0.07616753512336938,0.24391011383188,0.9007924158612057,0.18305981435180274,0.5807404255386285,0.2945625068095953,0.5058823193604426,0.3973242508427304,0.9756875205504605,0.5841680656379398,0.6663052018057263,0.7595196942663752,0.21571849360048434,0.034258743642127554,0.9590356567381337,0.8450829883763401,0.30251127748956597,0.854386364782774,0.25068755134842,0.7357913173419612,0.6748371588439573,0.011643462598377119,0.7780116496603872,0.21034079755829482,0.4652683805768393,0.7862556886352279,0.13988096171092912,0.03281569124067418,0.402588000237473,0.6981130988829413,0.2701597037675898,0.9456714591222644,0.9587956890687666,0.17278294474407618,0.7795799142097923,0.5058128553041521,0.8821561261771393,0.005499738142562327,0.08554285399704864,0.37507190067337126,0.5897454956126627,0.3183381286988981,0.09469360469969113,0.04657158687813201,0.9282123330595837,0.6630079427951905,0.345745383059638,0.11754219288982737,0.9195056393659711,0.8466531823413438,0.4158813823498785,0.12601164076005678,0.47959581959141495,0.5898065619889699,0.6295595456021276,0.18322083109449128,0.43043760601601067,0.040060656827184515,0.10495727643368447,0.1494309344914112,0.5877354951847712,0.11826844286084803,0.9688444881440859,0.8158647474643378,0.26066228493497545,0.038443494164359215,0.679248887899768,0.697857108610019,0.975648020807963,0.9958042425752966,0.9658928729030657,0.9016168787944144,0.15437300412332122,0.6738405194545323,0.8342529173663044,0.6228525580657353,0.54108292771299,0.9597530566340803,0.8975226508166572,0.27674817783583394,0.9496572917121086,0.890462746421566,0.4656995720311573,0.3023047548088049,0.7949989251657457,0.009007922033200999,0.41897201404741313,0.6256738667529058,0.9758026276824999,0.580238559018077,0.8951321394939257,0.4131361513831372,0.4642547405310049,0.8609783953840117,0.8615996241211273,0.9486912773906402,0.4693582419343596,0.5480676766439244,0.7730907544791936,0.023158858832662,0.9061995579895741,0.3830256979870904,0.625456290295455,0.7509321028058867,0.6118646903363618,0.202956415979754,0.4093214161605294,0.949013837619508,0.09400942841913829,0.017511107866661435,0.12854847018760363,0.9366632734749275,0.6499722775474996,0.6191500735813702,0.15300359547980968,0.7860410768114916,0.14248555415557274,0.06873677585343163,0.551325964070474,0.9420152187645853,0.49886560815848446,0.8112945771070191,0.8806589512899287,0.583160763225124,0.06954108841093143,0.9400521809434615,0.4295053785886621,0.9062641429159503,0.14814221912539183,0.15259311498482175,0.3490459231540305,0.9792102412959846,0.648861371449013,0.7848017495050797,0.8910557960994806,0.5485619029404264,0.40834158597541825,0.6576939192818685,0.893818577630036,0.1223011599811028,0.3398519250426323,0.3371204822874483,0.8033500736806768,0.33123730365813175,0.428581193857967,0.02746232534311388,0.002974053798155296,0.8234579542262302,0.19922563705966057,0.8423941349275077,0.8396715318243277,0.7001486334937349,0.969450616566072,0.5977045153676733,0.6084927256119949,0.9078583475169107,0.0643717712767441,0.41942305939945357,0.4627137105015855,0.9333860662975106,0.21739356350058647,0.1603895600166403,0.4837249605218187,0.6043303302602177,0.6967354561361379,0.5581870143479413,0.4441740150405987,0.7470498616844573,0.4224695334469919,0.47858861328047775,0.3579992930494288,0.9404001867976555,0.015628170889789517,0.26572575037739776,0.7860778687064385,0.05164276747174501,0.5856153264509111,0.7673942591527751,0.6644819556152906,0.9735574688690217,0.7932940481451002,0.06356760617759172,0.8485435265299415,0.6029848707439518,0.6284763869803253,0.8747004787834808,0.9626184482621959,0.01087172343324827,0.8552627451367105,0.11820014145748226,0.1433469393668736,0.4087035303631975,0.013214898520852225,0.7169106898820283,0.8631576027009307,0.06427232223719759,0.54836754416628,0.05265805975133042,0.9616039437704534,0.830221250765198,0.5525221869918251,0.123379490775966,0.01706753500419933,0.8608420380576459,0.1388017302746164,0.3965267118099369,0.3643322912117998,0.16476895999570695,0.8045676922200834,0.8492157289681719,0.6984354377002387,0.32125604704745414,0.6819342151064626,0.3748033131617201,0.2018433062906152,0.4761157035687512,0.41255875567065914,0.9756642071901571,0.6657121694227084,0.9051529272956559,0.5123711846567581,0.44612492431086526,0.8168177135403558,0.5770316832764945,0.36460781151310107,0.9202350166278103,0.07618432007084741,0.5239842808868533,0.18096063817596197,0.4675129367834562,0.9848795905220556,0.5166869875188835,0.6177464785300588,0.06284790278551167,0.1759014097055881,0.47246655754170563,0.6260450262268928,0.044362428938726994,0.21019182391862457,0.44425769284651495,0.8390439989061668,0.8354283427604158,0.8800226409040954,0.09275455884574013,0.21595170319710422,0.8958281885935722,0.626303520694089,0.17718609733649127,0.833262399184736,0.5754511963550379,0.36611679340694403,0.6750603444065056,0.1783266563338466,0.5437805058676568,0.05067014105989154,0.7726110786296105,0.5193087890256031,0.05737388644937458,0.9564238414627895,0.23650763909556405,0.8358293343687027,0.2030394355315509,0.9860710814010569,0.7670070776732315,0.1304740652288664,0.683281185008737,0.9014755030296702,0.8520998204065957,0.3691444850924651,0.8452809097087416,0.2866971380324761,0.8294222960404447,0.09642899642973735,0.9514725999308802,0.5225009428829611,0.0455392624452402,0.3771092200346323,0.39075345252520255,0.13747220259422033,0.2368436004929323,0.4892414369207849,0.3427812216441588,0.7542689306602937,0.7280899925501639,0.5839025571927222,0.3739425373650461,0.4932662689881967,0.1796939142731978,0.04637429248234948,0.409083342063423,0.7823973259905828,0.8374785461209568,0.590894595744398,0.0012140206041506563,0.1490257742067903,0.24471826460625556,0.1368549250361405,0.6132774824560474,0.8038247560723619,0.6312402129324579,0.16322113136956073,0.9216582707571582,0.1697399628878743,0.23728431750243661,0.14785990510548364,0.7238120592661044,0.8754124650600867,0.3710156278948541,0.7779383903749855,0.41561628921882765,0.8279460774795858,0.3075038392429319,0.751675267725915,0.032938720949168165,0.3307414508407154,0.06863893594688175,0.008208945840913029,0.11966241918738318,0.34065030403051677,0.8960550691281535,0.27349927649818917,0.6523879492356701,0.6055088373030325,0.31920246595391133,0.30254091530063587,0.8574196999543464,0.12576255031124783,0.7035746953143324,0.4569018733075296,0.3276287771098485,0.20398439068065144,0.5623491746930869,0.8363090940646649,0.07776403300986379,0.42223842383883103,0.4833792764350935,0.7528431539524181,0.1493649998166401,0.2952227665994521,0.010446584873847309,0.6154415910055173,0.47474708305366453,0.27850314531519194,0.5675887107353933,0.23425276704233666,0.7078168996485649,0.21517819420639495,0.6731769933373969,0.3749377946984983,0.2710012345789803,0.3094170781298814,0.8354361347325948,0.24908679191971672,0.33917121464444233,0.7770820105919221,0.9279203749066297,0.743669977797595,0.18580618177222696,0.5142526424465613,0.75182235945578,0.9297021549607793,0.7286926147697421,0.26647385344609775,0.2830344077214595,0.9760751988795257,0.8958531647391029,0.25337950390064223,0.04039230074480771,0.4206330230609411,0.29571009958496397,0.5236253524316622,0.6561468312770552,0.6585208317958074,0.7559704292773821,0.8684222855781261,0.7399909221400979,0.04162140286062843,0.16382966732739168,0.6056848684599343,0.27097194820264325,0.08988714912584972,0.5109994708092345,0.9127391655833387,0.8588251908072028,0.31706830499029626,0.20930832081950546,0.753792699700826,0.9126888449144377,0.4871209859408021,0.560202428800822,0.9191199485290019,0.808073355120283,0.0047781531635419094,0.7076692299039703,0.5359399773745028,0.9539129089472136,0.9262643188791914,0.5298047576986914,0.7043172159837021,0.6688913606752497,0.8757718969736543,0.19420323939999018,0.033895200958347416,0.4674018139872749,0.05817535023074527,0.39509575150560317,0.8610272007428242,0.5179775383917841,0.1134015883051338,0.351470927187594,0.18664775452339877,0.11377747657014181,0.4873418062677447,0.6766624881398046,0.3356205633942356,0.7678006178317808,0.5480607839045248,0.3570129659732346,0.14649715424346177,0.13611727657831652,0.14292841297776926,0.05448597546379097,0.5573550795588899,0.66272984256817,0.3095950898787554,0.6121195616897102,0.22929796638931998,0.9516361899759432,0.014307934150724733,0.2698555679318697,0.7427443721220649,0.431486169811779]},\"selected\":{\"id\":\"2134\"},\"selection_policy\":{\"id\":\"2224\"}},\"id\":\"2118\",\"type\":\"ColumnDataSource\"},{\"attributes\":{},\"id\":\"2105\",\"type\":\"BasicTicker\"},{\"attributes\":{\"tools\":[{\"id\":\"2112\"},{\"id\":\"2113\"}]},\"id\":\"2115\",\"type\":\"Toolbar\"},{\"attributes\":{\"source\":{\"id\":\"2118\"}},\"id\":\"2125\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"2100\",\"type\":\"LinearScale\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"field\":\"color\"},\"hatch_alpha\":{\"value\":0.2},\"hatch_color\":{\"field\":\"color\"},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"field\":\"color\"},\"size\":{\"value\":8},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2123\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"2102\",\"type\":\"LinearScale\"},{\"attributes\":{\"args\":{\"s1\":{\"id\":\"2118\"},\"s2\":{\"id\":\"2126\"}},\"code\":\"\\n var inds = s1.selected.indices;\\n if (inds.length == 0)\\n return;\\n\\n var ym = 0\\n for (var i = 0; i < inds.length; i++) {\\n ym += s1.data.y[inds[i]]\\n }\\n \\n ym /= inds.length\\n s2.data.ym = [ym, ym]\\n\\n // necessary because the source.data mutated in-place\\n s2.change.emit(); \\n \"},\"id\":\"2133\",\"type\":\"CustomJS\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"2222\"},\"group\":null,\"major_label_policy\":{\"id\":\"2223\"},\"ticker\":{\"id\":\"2105\"}},\"id\":\"2104\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"2226\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"axis\":{\"id\":\"2104\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"2107\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"2223\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"2109\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"2220\",\"type\":\"AllLabels\"},{\"attributes\":{\"coordinates\":null,\"fill_alpha\":0.5,\"fill_color\":\"lightgrey\",\"group\":null,\"level\":\"overlay\",\"line_alpha\":1.0,\"line_color\":\"black\",\"line_dash\":[4,4],\"line_width\":2,\"syncable\":false,\"xs_units\":\"screen\",\"ys_units\":\"screen\"},\"id\":\"2114\",\"type\":\"PolyAnnotation\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"2219\"},\"group\":null,\"major_label_policy\":{\"id\":\"2220\"},\"ticker\":{\"id\":\"2109\"}},\"id\":\"2108\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"2219\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{},\"id\":\"2222\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.4},\"fill_color\":{\"field\":\"color\"},\"hatch_alpha\":{\"value\":0.4},\"hatch_color\":{\"field\":\"color\"},\"line_alpha\":{\"value\":0.4},\"line_color\":{\"field\":\"color\"},\"size\":{\"value\":8},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2120\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"2224\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"line_alpha\":0.6,\"line_color\":\"orange\",\"line_width\":5,\"x\":{\"field\":\"xm\"},\"y\":{\"field\":\"ym\"}},\"id\":\"2128\",\"type\":\"Line\"},{\"attributes\":{\"source\":{\"id\":\"2126\"}},\"id\":\"2132\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"2227\",\"type\":\"Selection\"},{\"attributes\":{\"axis\":{\"id\":\"2108\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"2111\",\"type\":\"Grid\"},{\"attributes\":{\"overlay\":{\"id\":\"2114\"}},\"id\":\"2112\",\"type\":\"LassoSelectTool\"},{\"attributes\":{\"data\":{\"xm\":[0,1],\"ym\":[0.5,0.5]},\"selected\":{\"id\":\"2227\"},\"selection_policy\":{\"id\":\"2226\"}},\"id\":\"2126\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"line_alpha\":0.1,\"line_color\":\"orange\",\"line_width\":5,\"x\":{\"field\":\"xm\"},\"y\":{\"field\":\"ym\"}},\"id\":\"2129\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"2113\",\"type\":\"ResetTool\"},{\"attributes\":{\"line_alpha\":0.2,\"line_color\":\"orange\",\"line_width\":5,\"x\":{\"field\":\"xm\"},\"y\":{\"field\":\"ym\"}},\"id\":\"2130\",\"type\":\"Line\"},{\"attributes\":{},\"id\":\"2096\",\"type\":\"DataRange1d\"}],\"root_ids\":[\"2093\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n",
1078
+ " const render_items = [{\"docid\":\"a13a1f3a-afe1-4f20-8979-1a6f863b1f9a\",\"root_ids\":[\"2093\"],\"roots\":{\"2093\":\"359df0da-6388-4e41-9dcf-335776a4f4ca\"}}];\n",
1079
+ " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
1080
+ " }\n",
1081
+ " if (root.Bokeh !== undefined) {\n",
1082
+ " embed_document(root);\n",
1083
+ " } else {\n",
1084
+ " let attempts = 0;\n",
1085
+ " const timer = setInterval(function(root) {\n",
1086
+ " if (root.Bokeh !== undefined) {\n",
1087
+ " clearInterval(timer);\n",
1088
+ " embed_document(root);\n",
1089
+ " } else {\n",
1090
+ " attempts++;\n",
1091
+ " if (attempts > 100) {\n",
1092
+ " clearInterval(timer);\n",
1093
+ " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
1094
+ " }\n",
1095
+ " }\n",
1096
+ " }, 10, root)\n",
1097
+ " }\n",
1098
+ "})(window);"
1099
+ ],
1100
+ "application/vnd.bokehjs_exec.v0+json": ""
1101
+ },
1102
+ "metadata": {
1103
+ "application/vnd.bokehjs_exec.v0+json": {
1104
+ "id": "2093"
1105
+ }
1106
+ },
1107
+ "output_type": "display_data"
1108
+ }
1109
+ ],
1110
+ "source": [
1111
+ "x = [random() for x in range(500)]\n",
1112
+ "y = [random() for y in range(500)]\n",
1113
+ "color = [\"navy\"] * len(x)\n",
1114
+ "\n",
1115
+ "# create a new plot using figure\n",
1116
+ "p = figure(\n",
1117
+ " plot_width=800,\n",
1118
+ " plot_height=400,\n",
1119
+ " tools=\"lasso_select, reset\",\n",
1120
+ " title=\"Select Here\"\n",
1121
+ ")\n",
1122
+ "\n",
1123
+ "s1 = ColumnDataSource(\n",
1124
+ " data=dict(\n",
1125
+ " x=x,\n",
1126
+ " y=y,\n",
1127
+ " color=color\n",
1128
+ " )\n",
1129
+ ")\n",
1130
+ "p.circle(\n",
1131
+ " 'x',\n",
1132
+ " 'y',\n",
1133
+ " color='color',\n",
1134
+ " size=8,\n",
1135
+ " alpha=0.4,\n",
1136
+ " source=s1, \n",
1137
+ " selection_color=\"firebrick\",\n",
1138
+ " selection_alpha=0.4\n",
1139
+ ")\n",
1140
+ "\n",
1141
+ "s2 = ColumnDataSource(\n",
1142
+ " data=dict(\n",
1143
+ " xm=[0,1],\n",
1144
+ " ym=[0.5, 0.5]\n",
1145
+ " )\n",
1146
+ ")\n",
1147
+ "p.line(\n",
1148
+ " x='xm',\n",
1149
+ " y='ym',\n",
1150
+ " color=\"orange\",\n",
1151
+ " line_width=5,\n",
1152
+ " alpha=0.6,\n",
1153
+ " source=s2\n",
1154
+ ")\n",
1155
+ "\n",
1156
+ "callback = CustomJS(\n",
1157
+ " args=dict(\n",
1158
+ " s1=s1,\n",
1159
+ " s2=s2\n",
1160
+ " ),\n",
1161
+ " code=\"\"\"\n",
1162
+ " var inds = s1.selected.indices;\n",
1163
+ " if (inds.length == 0)\n",
1164
+ " return;\n",
1165
+ "\n",
1166
+ " var ym = 0\n",
1167
+ " for (var i = 0; i < inds.length; i++) {\n",
1168
+ " ym += s1.data.y[inds[i]]\n",
1169
+ " }\n",
1170
+ " \n",
1171
+ " ym /= inds.length\n",
1172
+ " s2.data.ym = [ym, ym]\n",
1173
+ "\n",
1174
+ " // necessary because the source.data mutated in-place\n",
1175
+ " s2.change.emit(); \n",
1176
+ " \"\"\"\n",
1177
+ ")\n",
1178
+ "\n",
1179
+ "s1.selected.js_on_change(\n",
1180
+ " 'indices',\n",
1181
+ " callback\n",
1182
+ ")\n",
1183
+ "\n",
1184
+ "# show the results\n",
1185
+ "show(p)"
1186
+ ]
1187
+ },
1188
+ {
1189
+ "cell_type": "markdown",
1190
+ "metadata": {},
1191
+ "source": [
1192
+ "### CustomJS for UI Events\n",
1193
+ "\n",
1194
+ "Bokeh also has a general events system. All of the available UI events, and their properties, are listed in the Reference Guide section for [bokeh.events](https://bokeh.pydata.org/en/latest/docs/reference/events.html)"
1195
+ ]
1196
+ },
1197
+ {
1198
+ "cell_type": "code",
1199
+ "execution_count": 17,
1200
+ "metadata": {},
1201
+ "outputs": [],
1202
+ "source": [
1203
+ "# from bokeh import events\n",
1204
+ "# from bokeh.models import CustomJS, Div, Button\n",
1205
+ "# from bokeh.layouts import column, row"
1206
+ ]
1207
+ },
1208
+ {
1209
+ "cell_type": "code",
1210
+ "execution_count": 18,
1211
+ "metadata": {},
1212
+ "outputs": [
1213
+ {
1214
+ "data": {
1215
+ "text/html": [
1216
+ "\n",
1217
+ " <div class=\"bk-root\" id=\"eb834bd5-69dd-471f-8dd8-9a5c3e71877a\" data-root-id=\"2321\"></div>\n"
1218
+ ]
1219
+ },
1220
+ "metadata": {},
1221
+ "output_type": "display_data"
1222
+ },
1223
+ {
1224
+ "data": {
1225
+ "application/javascript": [
1226
+ "(function(root) {\n",
1227
+ " function embed_document(root) {\n",
1228
+ " const docs_json = {\"1aca7d6e-8ba8-4bc7-8dca-c03fa45a148d\":{\"defs\":[],\"roots\":{\"references\":[{\"attributes\":{\"children\":[{\"id\":\"2319\"},{\"id\":\"2320\"}]},\"id\":\"2321\",\"type\":\"Column\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.2},\"fill_color\":{\"value\":\"#1f77b4\"},\"hatch_alpha\":{\"value\":0.2},\"line_alpha\":{\"value\":0.2},\"line_color\":{\"value\":null},\"radius\":{\"value\":1},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2315\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"2426\",\"type\":\"UnionRenderers\"},{\"attributes\":{\"axis\":{\"id\":\"2302\"},\"coordinates\":null,\"dimension\":1,\"group\":null,\"ticker\":null},\"id\":\"2305\",\"type\":\"Grid\"},{\"attributes\":{},\"id\":\"2422\",\"type\":\"AllLabels\"},{\"attributes\":{\"coordinates\":null,\"data_source\":{\"id\":\"2312\"},\"glyph\":{\"id\":\"2313\"},\"group\":null,\"hover_glyph\":null,\"muted_glyph\":{\"id\":\"2315\"},\"nonselection_glyph\":{\"id\":\"2314\"},\"view\":{\"id\":\"2317\"}},\"id\":\"2316\",\"type\":\"GlyphRenderer\"},{\"attributes\":{},\"id\":\"2307\",\"type\":\"ResetTool\"},{\"attributes\":{\"fill_alpha\":{\"value\":0.6},\"fill_color\":{\"value\":\"#1f77b4\"},\"line_color\":{\"value\":null},\"radius\":{\"value\":1},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2313\",\"type\":\"Circle\"},{\"attributes\":{\"overlay\":{\"id\":\"2308\"}},\"id\":\"2306\",\"type\":\"BoxSelectTool\"},{\"attributes\":{\"coordinates\":null,\"group\":null},\"id\":\"2418\",\"type\":\"Title\"},{\"attributes\":{},\"id\":\"2421\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"2424\"},\"group\":null,\"major_label_policy\":{\"id\":\"2425\"},\"ticker\":{\"id\":\"2299\"}},\"id\":\"2298\",\"type\":\"LinearAxis\"},{\"attributes\":{\"source\":{\"id\":\"2312\"}},\"id\":\"2317\",\"type\":\"CDSView\"},{\"attributes\":{},\"id\":\"2424\",\"type\":\"BasicTickFormatter\"},{\"attributes\":{\"data\":{\"x\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[2000]},\"y\":{\"__ndarray__\":\"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\",\"dtype\":\"float64\",\"order\":\"little\",\"shape\":[2000]}},\"selected\":{\"id\":\"2427\"},\"selection_policy\":{\"id\":\"2426\"}},\"id\":\"2312\",\"type\":\"ColumnDataSource\"},{\"attributes\":{\"width\":400},\"id\":\"2318\",\"type\":\"Div\"},{\"attributes\":{\"tools\":[{\"id\":\"2306\"},{\"id\":\"2307\"}]},\"id\":\"2309\",\"type\":\"Toolbar\"},{\"attributes\":{\"children\":[{\"id\":\"2289\"},{\"id\":\"2318\"}]},\"id\":\"2320\",\"type\":\"Row\"},{\"attributes\":{\"icon\":null,\"js_event_callbacks\":{\"button_click\":[{\"id\":\"2322\"}]},\"width\":300},\"id\":\"2319\",\"type\":\"Button\"},{\"attributes\":{\"below\":[{\"id\":\"2298\"}],\"center\":[{\"id\":\"2301\"},{\"id\":\"2305\"}],\"height\":400,\"js_event_callbacks\":{\"selectiongeometry\":[{\"id\":\"2323\"}]},\"left\":[{\"id\":\"2302\"}],\"renderers\":[{\"id\":\"2316\"}],\"title\":{\"id\":\"2418\"},\"toolbar\":{\"id\":\"2309\"},\"width\":800,\"x_range\":{\"id\":\"2290\"},\"x_scale\":{\"id\":\"2294\"},\"y_range\":{\"id\":\"2292\"},\"y_scale\":{\"id\":\"2296\"}},\"id\":\"2289\",\"subtype\":\"Figure\",\"type\":\"Plot\"},{\"attributes\":{\"coordinates\":null,\"formatter\":{\"id\":\"2421\"},\"group\":null,\"major_label_policy\":{\"id\":\"2422\"},\"ticker\":{\"id\":\"2303\"}},\"id\":\"2302\",\"type\":\"LinearAxis\"},{\"attributes\":{},\"id\":\"2427\",\"type\":\"Selection\"},{\"attributes\":{},\"id\":\"2290\",\"type\":\"DataRange1d\"},{\"attributes\":{},\"id\":\"2294\",\"type\":\"LinearScale\"},{\"attributes\":{},\"id\":\"2303\",\"type\":\"BasicTicker\"},{\"attributes\":{},\"id\":\"2296\",\"type\":\"LinearScale\"},{\"attributes\":{\"axis\":{\"id\":\"2298\"},\"coordinates\":null,\"group\":null,\"ticker\":null},\"id\":\"2301\",\"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\":null},\"radius\":{\"value\":1},\"x\":{\"field\":\"x\"},\"y\":{\"field\":\"y\"}},\"id\":\"2314\",\"type\":\"Circle\"},{\"attributes\":{},\"id\":\"2425\",\"type\":\"AllLabels\"},{\"attributes\":{},\"id\":\"2299\",\"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\":\"2308\",\"type\":\"BoxAnnotation\"},{\"attributes\":{\"args\":{\"div\":{\"id\":\"2318\"}},\"code\":\"\\n div.text = \\\"Selection! <p> <p>\\\" + JSON.stringify(cb_obj.geometry, undefined, 2);\\n \"},\"id\":\"2323\",\"type\":\"CustomJS\"},{\"attributes\":{},\"id\":\"2292\",\"type\":\"DataRange1d\"},{\"attributes\":{\"args\":{\"div\":{\"id\":\"2318\"}},\"code\":\"\\n div.text = \\\"Button!\\\";\\n \"},\"id\":\"2322\",\"type\":\"CustomJS\"}],\"root_ids\":[\"2321\"]},\"title\":\"Bokeh Application\",\"version\":\"2.4.3\"}};\n",
1229
+ " const render_items = [{\"docid\":\"1aca7d6e-8ba8-4bc7-8dca-c03fa45a148d\",\"root_ids\":[\"2321\"],\"roots\":{\"2321\":\"eb834bd5-69dd-471f-8dd8-9a5c3e71877a\"}}];\n",
1230
+ " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n",
1231
+ " }\n",
1232
+ " if (root.Bokeh !== undefined) {\n",
1233
+ " embed_document(root);\n",
1234
+ " } else {\n",
1235
+ " let attempts = 0;\n",
1236
+ " const timer = setInterval(function(root) {\n",
1237
+ " if (root.Bokeh !== undefined) {\n",
1238
+ " clearInterval(timer);\n",
1239
+ " embed_document(root);\n",
1240
+ " } else {\n",
1241
+ " attempts++;\n",
1242
+ " if (attempts > 100) {\n",
1243
+ " clearInterval(timer);\n",
1244
+ " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n",
1245
+ " }\n",
1246
+ " }\n",
1247
+ " }, 10, root)\n",
1248
+ " }\n",
1249
+ "})(window);"
1250
+ ],
1251
+ "application/vnd.bokehjs_exec.v0+json": ""
1252
+ },
1253
+ "metadata": {
1254
+ "application/vnd.bokehjs_exec.v0+json": {
1255
+ "id": "2321"
1256
+ }
1257
+ },
1258
+ "output_type": "display_data"
1259
+ }
1260
+ ],
1261
+ "source": [
1262
+ "x = np.random.random(size=2000) * 100\n",
1263
+ "y = np.random.random(size=2000) * 100\n",
1264
+ "\n",
1265
+ "# create a new plot using figure\n",
1266
+ "p = figure(\n",
1267
+ " plot_height=400,\n",
1268
+ " plot_width=800,\n",
1269
+ " tools=\"box_select, reset\"\n",
1270
+ ")\n",
1271
+ "\n",
1272
+ "p.scatter(\n",
1273
+ " x,\n",
1274
+ " y,\n",
1275
+ " radius=1,\n",
1276
+ " fill_alpha=0.6,\n",
1277
+ " line_color=None\n",
1278
+ ")\n",
1279
+ "\n",
1280
+ "div = Div(width=400)\n",
1281
+ "button = Button(\n",
1282
+ " label=\"Button\",\n",
1283
+ " width=300\n",
1284
+ ")\n",
1285
+ "\n",
1286
+ "layout = column(\n",
1287
+ " button,\n",
1288
+ " row(p, div)\n",
1289
+ ")\n",
1290
+ "\n",
1291
+ "# Events with no attributes\n",
1292
+ "button.js_on_event(\n",
1293
+ " events.ButtonClick,\n",
1294
+ " CustomJS(\n",
1295
+ " args=dict(div=div),\n",
1296
+ " code=\"\"\"\n",
1297
+ " div.text = \"Button!\";\n",
1298
+ " \"\"\"\n",
1299
+ " )\n",
1300
+ ") \n",
1301
+ "\n",
1302
+ "p.js_on_event(\n",
1303
+ " events.SelectionGeometry,\n",
1304
+ " CustomJS(\n",
1305
+ " args=dict(div=div),\n",
1306
+ " code=\"\"\"\n",
1307
+ " div.text = \"Selection! <p> <p>\" + JSON.stringify(cb_obj.geometry, undefined, 2);\n",
1308
+ " \"\"\"\n",
1309
+ " )\n",
1310
+ ")\n",
1311
+ "\n",
1312
+ "show(layout)"
1313
+ ]
1314
+ },
1315
+ {
1316
+ "cell_type": "markdown",
1317
+ "metadata": {},
1318
+ "source": [
1319
+ "### Additional Information\n",
1320
+ "\n",
1321
+ "There are many kinds of interactions and events that can be connected to `CustomJS` callbacks. \n",
1322
+ "\n",
1323
+ "\n",
1324
+ "* Widgets - Button, Toggle, Dropdown, TextInput, AutocompleteInput, Select, Multiselect, Slider, (DateRangeSlider), DatePicker,\n",
1325
+ "* Tools - TapTool, BoxSelectTool, HoverTool,\n",
1326
+ "* Selection - ColumnDataSource, AjaxDataSource, BlazeDataSource, ServerDataSource\n",
1327
+ "* Ranges - Range1d, DataRange1d, FactorRange\n",
1328
+ "\n",
1329
+ "\n",
1330
+ "For more complete examples the User Guide section on [JavaScript Interactions](https://bokeh.pydata.org/en/latest/docs/user_guide/interaction.html)"
1331
+ ]
1332
+ }
1333
+ ],
1334
+ "metadata": {
1335
+ "anaconda-cloud": {},
1336
+ "kernelspec": {
1337
+ "display_name": "Python 3 (ipykernel)",
1338
+ "language": "python",
1339
+ "name": "python3"
1340
+ },
1341
+ "language_info": {
1342
+ "codemirror_mode": {
1343
+ "name": "ipython",
1344
+ "version": 3
1345
+ },
1346
+ "file_extension": ".py",
1347
+ "mimetype": "text/x-python",
1348
+ "name": "python",
1349
+ "nbconvert_exporter": "python",
1350
+ "pygments_lexer": "ipython3",
1351
+ "version": "3.7.9"
1352
+ }
1353
+ },
1354
+ "nbformat": 4,
1355
+ "nbformat_minor": 4
1356
+ }