Изменение диапазона оси с помощью RangeSlider
Я создал сюжет с боке и сейчас пытаюсь добавить к нему несколько виджетов. В настоящее время я хочу изменить ось X с помощью RangeSlider, но я думаю, что у меня есть некоторые проблемы с обратным вызовом. В приложении вы найдете код:
import pandas as pd
import numpy as np
import bokeh.plotting as bp
from bokeh.models import CustomJS
from bokeh.models.widgets import RangeSlider
from bokeh.layouts import row, widgetbox
from bokeh.plotting import figure, show, output_file
df = pd.DataFrame(np.random.randint(0,30,size=(100, 3)), columns=list('ABC'))
df.index.name ='Numbers'
dt = bp.ColumnDataSource(df)
output_file("Plot.html")
p = figure(title="Example",
x_axis_label = "Number", y_axis_label = "Temperature in C",
x_range=(0,100))
p.line(source=dt, x='Numbers', y='A', color='blue', legend='Line A')
p.line(source=dt, x='Numbers', y='B', color='red', legend='Line B')
p.line(source=dt, x='Numbers', y='C', color='green', legend='Line C')
p.legend.click_policy="hide"
callback = CustomJS(args=dict(p=p), code="""
var a = cb_obj.value;
p.x_range = a;
p.change.emit();
""")
range_slider = RangeSlider(start=0, end=100,value=(2,75), step=1, title="Test")
range_slider.js_on_change('value', callback)
layout = row(p,widgetbox(range_slider))
show(layout)
Заранее спасибо!
1 ответ
Решение
Вы должны установить start
а также end
по ассортименту индивидуально:
callback = CustomJS(args=dict(p=p), code="""
var a = cb_obj.value;
p.x_range.start = a[0];
p.x_range.end = a[1];
""")
Кроме того, призыв к emit
не нужно