#****  libraries  ****v
import ast, collections, copy, json, os, sys
import bokeh
import bokeh.plotting as bkp
import bokeh.layouts as bkl
import bokeh.models as bkm
import bokeh.models.renderers as bkmr
import bokeh.models.sources as bkms
import bokeh.models.widgets as bkmw
import bokeh.io as bkio
import numpy as np
import pandas as pd

#****  EXAMPLE 1  ****v
# bkio.output_file("example_bokeh.html")
# 
# # data points
# a = [1,2,3,4]
# b = [5,6,7,8]
# plot_source = bkms.ColumnDataSource({"x_data": a, "y_data": b, "y_data_copy": copy.deepcopy(b)})
# 
# # make plot
# fig = bkp.Figure(title = "example_title", x_axis_label = "example_x", y_axis_label = "example_y")
# fig.circle("x_data", "y_data", source = plot_source, size = 3)
# 
# # make an input widget & callback
# widget_list = [] 
# def callback_plot_upper_limit(plot_source = plot_source, window = None):
#     """
#     """
#     
#     input_value = int(cb_obj.value)
#     x, y = plot_source.data["x_data"], plot_source.data["y_data"]
#     for i in range(len(x)):
#         y[i] = (plot_source.data["y_data_copy"])[i]
#         if y[i] > input_value:
#             y[i] = "apparently, you can't plot strings"
#     
#     plot_source.trigger('change')    
# widget_list.append(bkm.TextInput(title = "upper limit", callback = bkm.CustomJS.from_py_func(callback_plot_upper_limit)))
# 
# # display
# stuff = [fig, bkl.column(widget_list)]
# layout = bkl.layout([stuff])
# bkio.show(layout)
# bkio.reset_output()
#****  EXAMPLE 1  ****^



#****  EXAMPLE 2  ****v
# bkio.output_file("example_bokeh.html")
# 
# # data points
# a = [1,2,3,4]
# b = [5,6,7,8]
# plot_source = bkms.ColumnDataSource({"x_data": a, "y_data": b, "y_data_copy": copy.deepcopy(b)})
# 
# # make plot
# fig = bkp.Figure(title = "example_title", x_axis_label = "example_x", y_axis_label = "example_y")
# fig.circle("x_data", "y_data", source = plot_source, size = 3)
# 
# # make an input widget & callback
# widget_list = [] 
# def callback_plot_upper_limit(plot_source = plot_source, window = None):
#     """
#     """
#     
#     input_value = int(cb_obj.value)
#     x, y = plot_source.data["x_data"], plot_source.data["y_data"]
#     for i in range(len(x)):
#         y[i] = (plot_source.data["y_data_copy"])[i]
#         if y[i] > input_value:
#             y[i] = "apparently, you can't plot strings"
#     
#     plot_source.trigger('change')    
# widget_list.append(bkm.TextInput(title = "upper limit", callback = bkm.CustomJS.from_py_func(callback_plot_upper_limit)))
#     
# # make an output widget & callback
# output_column1 = bkmw.TableColumn(field = "x_data", title = "x data", sortable = False)
# output_column2 = bkmw.TableColumn(field = "y_data", title = "y data", sortable = False)
# output_table = bkmw.DataTable(source = plot_source, columns = [output_column1, output_column2], row_headers = False, sizing_mode = "scale_width", fit_columns = False)
# widget_list.append(output_table)
# 
# # display
# stuff = [fig, bkl.column(widget_list)]
# layout = bkl.layout([stuff])
# bkio.show(layout)
# bkio.reset_output()
#****  EXAMPLE 2  ****^