Боке - добавление виджетов
Модуль bokeh.models.widgets содержит определения объектов GUI, подобных элементам HTML-форм, таким как кнопка, ползунок, флажок, переключатель и т. Д. Эти элементы управления обеспечивают интерактивный интерфейс для построения графика. Вызов обработки, такой как изменение данных графика, изменение параметров графика и т. Д., Может выполняться пользовательскими функциями JavaScript, выполняемыми при соответствующих событиях.
Bokeh позволяет определить функцию обратного вызова двумя методами:
Использовать CustomJS callback так что интерактивность будет работать в автономных документах HTML.
Использовать Bokeh server и настроить обработчики событий.
В этом разделе мы увидим, как добавить виджеты Bokeh и назначить обратные вызовы JavaScript.
Кнопка
Этот виджет представляет собой кнопку с возможностью нажатия, которая обычно используется для вызова определенного пользователем обработчика обратного вызова. Конструктор принимает следующие параметры -
Button(label, icon, callback)
Параметр метки - это строка, используемая в качестве заголовка кнопки, а обратный вызов - это настраиваемая функция JavaScript, вызываемая при нажатии.
В следующем примере график и виджет «Кнопка» отображаются в макете «Столбец». Сам график отображает глиф линии между сериями данных x и y.
Пользовательская функция JavaScript с именем callback была определена с использованием CutomJS() function. Он получает ссылку на объект, запустивший обратный вызов (в данном случае кнопку) в переменной формы cb_obj.
Эта функция изменяет исходные данные ColumnDataSource и, наконец, передает это обновление в исходные данные.
from bokeh.layouts import column
from bokeh.models import CustomJS, ColumnDataSource
from bokeh.plotting import Figure, output_file, show
from bokeh.models.widgets import Button
x = [x*0.05 for x in range(0, 200)]
y = x
source = ColumnDataSource(data=dict(x=x, y=y))
plot = Figure(plot_width=400, plot_height=400)
plot.line('x', 'y', source=source, line_width=3, line_alpha=0.6)
callback = CustomJS(args=dict(source=source), code="""
var data = source.data;
x = data['x']
y = data['y']
for (i = 0; i < x.length; i++) {
y[i] = Math.pow(x[i], 4)
}
source.change.emit();
""")
btn = Button(label="click here", callback=callback, name="1")
layout = column(btn , plot)
show(layout)
Выход (начальный)
Нажмите на кнопку в верхней части графика и посмотрите обновленный рисунок графика, который выглядит следующим образом:
Вывод (после щелчка)
Слайдер
С помощью ползунка можно выбрать число между назначенными ему начальными и конечными свойствами.
Slider(start, end, step, value)
В следующем примере мы регистрируем функцию обратного вызова для события on_change слайдера. Мгновенное числовое значение ползунка доступно обработчику в форме cb_obj.value, которое используется для изменения данных ColumnDatasource. Фигура графика постоянно обновляется по мере того, как вы перемещаете позицию.
from bokeh.layouts import column
from bokeh.models import CustomJS, ColumnDataSource
from bokeh.plotting import Figure, output_file, show
from bokeh.models.widgets import Slider
x = [x*0.05 for x in range(0, 200)]
y = x
source = ColumnDataSource(data=dict(x=x, y=y))
plot = Figure(plot_width=400, plot_height=400)
plot.line('x', 'y', source=source, line_width=3, line_alpha=0.6)
handler = CustomJS(args=dict(source=source), code="""
var data = source.data;
var f = cb_obj.value
var x = data['x']
var y = data['y']
for (var i = 0; i < x.length; i++) {
y[i] = Math.pow(x[i], f)
}
source.change.emit();
""")
slider = Slider(start=0.0, end=5, value=1, step=.25, title="Slider Value")
slider.js_on_change('value', handler)
layout = column(slider, plot)
show(layout)
Вывод
RadioGroup
Этот виджет представляет собой набор взаимоисключающих кнопок переключения, показывающих круглые кнопки слева от заголовка.
RadioGroup(labels, active)
Где метки - это список заголовков, а активный - это индекс выбранной опции.
Выбрать
Этот виджет представляет собой простой раскрывающийся список строковых элементов, один из которых можно выбрать. Выбранная строка появляется в верхнем окне и является параметром значения.
Select(options, value)
Список строковых элементов в раскрывающемся списке представлен в виде объекта списка опций.
Ниже приведен комбинированный пример переключателя и виджетов выбора, оба из которых обеспечивают три различных отношения между рядами данных x и y. ВRadioGroup и Select widgets регистрируются соответствующими обработчиками через метод on_change ().
from bokeh.layouts import column
from bokeh.models import CustomJS, ColumnDataSource
from bokeh.plotting import Figure, output_file, show
from bokeh.models.widgets import RadioGroup, Select
x = [x*0.05 for x in range(0, 200)]
y = x
source = ColumnDataSource(data=dict(x=x, y=y))
plot = Figure(plot_width=400, plot_height=400)
plot.line('x', 'y', source=source, line_width=3, line_alpha=0.6)
radiohandler = CustomJS(args=dict(source=source), code="""
var data = source.data;
console.log('Tap event occurred at x-position: ' + cb_obj.active);
//plot.title.text=cb_obj.value;
x = data['x']
y = data['y']
if (cb_obj.active==0){
for (i = 0; i < x.length; i++) {
y[i] = x[i];
}
}
if (cb_obj.active==1){
for (i = 0; i < x.length; i++) {
y[i] = Math.pow(x[i], 2)
}
}
if (cb_obj.active==2){
for (i = 0; i < x.length; i++) {
y[i] = Math.pow(x[i], 4)
}
}
source.change.emit();
""")
selecthandler = CustomJS(args=dict(source=source), code="""
var data = source.data;
console.log('Tap event occurred at x-position: ' + cb_obj.value);
//plot.title.text=cb_obj.value;
x = data['x']
y = data['y']
if (cb_obj.value=="line"){
for (i = 0; i < x.length; i++) {
y[i] = x[i];
}
}
if (cb_obj.value=="SquareCurve"){
for (i = 0; i < x.length; i++) {
y[i] = Math.pow(x[i], 2)
}
}
if (cb_obj.value=="CubeCurve"){
for (i = 0; i < x.length; i++) {
y[i] = Math.pow(x[i], 4)
}
}
source.change.emit();
""")
radio = RadioGroup(
labels=["line", "SqureCurve", "CubeCurve"], active=0)
radio.js_on_change('active', radiohandler)
select = Select(title="Select:", value='line', options=["line", "SquareCurve", "CubeCurve"])
select.js_on_change('value', selecthandler)
layout = column(radio, select, plot)
show(layout)
Вывод
Виджет вкладки
Так же, как в браузере, каждая вкладка может отображать разные веб-страницы, виджет вкладки представляет собой модель боке, обеспечивающую разный вид для каждой фигуры. В следующем примере два графика синусоидальных и косинусоидальных кривых отображаются на двух разных вкладках:
from bokeh.plotting import figure, output_file, show
from bokeh.models import Panel, Tabs
import numpy as np
import math
x=np.arange(0, math.pi*2, 0.05)
fig1=figure(plot_width=300, plot_height=300)
fig1.line(x, np.sin(x),line_width=2, line_color='navy')
tab1 = Panel(child=fig1, title="sine")
fig2=figure(plot_width=300, plot_height=300)
fig2.line(x,np.cos(x), line_width=2, line_color='orange')
tab2 = Panel(child=fig2, title="cos")
tabs = Tabs(tabs=[ tab1, tab2 ])
show(tabs)