我正在努力理解如何将 js_on_change 用于自嵌入散景堆叠条形图与下拉选择。简而言之,每当我们在下拉菜单中选择一个值时,它都应该将自己映射到主数据框的列列表中,然后可以将其用于堆叠条形图。
我认为我缺乏 Javascript 知识以及如何使用它。堆垛机,需要你的帮助。您将在下面找到应该在您的终端上运行的完整代码。
我从这个线程散景中借了一点- 使用 customJS 绘制不同的列
import pandas as pd
import numpy as np
import datetime
from bokeh.io import show
from bokeh.layouts import row, column
from bokeh.models import ColumnDataSource, CustomJS
from bokeh.plotting import figure, ColumnDataSource, show
from bokeh.models.widgets import Select
from bokeh.models import Label, Title, NumeralTickFormatter
df = pd.DataFrame.from_dict(
{
'Apples_green': {'2018': 100, '2019': 150, '2020': 200},
'Apples_red': {'2018': 200, '2019': 75, '2020': 25},
'Oranges_green': {'2018': 25, '2019': 60, '2020': 70},
'Oranges_red': {'2018': 100, '2019': 80, '2020': 10}
}
)
#List of columns for apples
initial_col = [i for i in df.columns.tolist() if i.startswith('Apples')]
selection_list = ["Apples", "Oranges"]
d_map = {
'Apples':['Apples_green', 'Apples_red'],
'Oranges':['Oranges_green', 'Oranges_red']
}
source = ColumnDataSource(df)
p = figure(plot_width=350, plot_height = 300,
x_range=df.index.drop_duplicates().tolist())
p.vbar_stack(initial_col, x='index',
width=0.9, color=['green', 'red'], source=source)
p.yaxis.formatter = NumeralTickFormatter(format='(0.00)')
select = Select(title="Fruit:", value=selection_list[0], options=selection_list)
select.js_on_change('value', CustomJS(args=dict(source=source, select=select, d_map = d_map), code="""
// print the selectd value of the select widget -
// this is printed in the browser console.
// cb_obj is the callback object, in this case the select
// widget. cb_obj.value is the selected value.
console.log(' changed selected option', cb_obj.value);
// create a new variable for the data of the column data source
// this is linked to the plot
var data = source.data;
// allocate the selected column to the field for the y values
data['{}'] = data[d_map[cb_obj.value]];
// register the change - this is required to process the change in
// the y values
source.change.emit();
""".format(d_map[selection_list[0]])))
col = column(select)
layout = row(col, p)
show(layout)
最终,它绘制了图形,但 javascript 部分不起作用。