#javascript #python #bokeh
#javascript #python #боке
Вопрос:
Я хотел бы получить помощь в переводе моей функции обратного вызова в bokeh с python на javascript. Далее показан мой код (я удалил большую его часть, поскольку он не был важен для перевода.)
#returns a CDS of a dataframe based on one parameter
def create_df(option):
return ColumnDataSource(incident_df)
all_df = create_df('all')
critical_df = create_df('1')
high_df = create_df('2')
avg_low_df = create_df('3/4')
data_points = create_df('all')
color_mapper=LinearColorMapper(palette=RdBu7,low=data_points.data['freq'].min(),high=data_points.data['freq'].max())
radio_button_group = RadioButtonGroup(
labels=["All Priorities", "1 - Critical", "2 - High", "3/4 - Average/Low"], active=0)
#Define the callback function
def callback(attr, old, new):
if radio_button_group.active == 0:
new_cds = all_df
if radio_button_group.active == 1:
new_cds = critical_df
if radio_button_group.active == 2:
new_cds = high_df
if radio_button_group.active == 3:
new_cds = avg_low_df
data_points.data = new_cds.data
color_mapper.low=min(data_points.data['freq'])
color_mapper.high=max(data_points.data['freq'])
radio_button_group.on_change('active', callback)
Комментарии:
1. Что вы пробовали до сих пор и где вы застряли?
Ответ №1:
Ваш обратный вызов Python может быть переведен в обратный вызов JS следующим образом (при условии, что он работает на Python):
from bokeh.models import CustomJS
code = """
if (radio_button_group.active == 0)
new_cds = all_df
if (radio_button_group.active == 1)
new_cds = critical_df
if (radio_button_group.active == 2)
new_cds = high_df
if (radio_button_group.active == 3)
new_cds = avg_low_df
data_points.data = new_cds.data
color_mapper.low = Math.min.apply(null, data_points.data['freq'])
color_mapper.high = Math.max.apply(null, data_points.data['freq'])
"""
callback = CustomJS(args = dict(data_points = data_points,
color_mapper = color_mapper
radio_button_group = radio_button_group
all_df = all_df,
critical_df = critical_df,
high_df = high_df,
avg_low_df = avg_low_df),
code = code)
radio_button_group.js_on_change('active', callback)
Комментарии:
1. Спасибо за ответ. Однако это не работает. Я получаю график по умолчанию, но когда я нажимаю кнопки, график не меняется. Я посмотрел на консоль, и когда я нажимаю на кнопку, она выдает следующую ошибку: «x_df не определен». Вы знаете, что я могу сделать, чтобы исправить это?
2. Я забыл добавить ваши источники данных в обратный вызов. Смотрите обновленный код. Но ошибка, которую вы получаете, отличается, и я не могу сказать, откуда она берется, пока не увижу полный код. Это сложно без полного обзора кода. Пожалуйста, всегда предоставляйте минимальный, но выполнимый код
3. Теперь код работает. Мне просто нужно было внести одно исправление в ваш код. Где это ‘color_mapper.low = Math.min (data_points.data[‘freq’])’ это должно быть ‘color_mapper.low = Math.min.apply (null, data_points.data.freq)’ и то же самое для максимального значения. Большое вам спасибо за вашу помощь.
4. @L.Rebelo, если этот ответ помог, рассмотрите возможность голосования / принятия в качестве ответа.
5. Выполнено. Спасибо за предупреждение.