我正在使用bokeh使用bokeh绘制一些数据,以遍历数据框中的列。由于某种原因,我设法在明确绘制的图中链接到的框选择和套索工具(即不是通过for循环生成的)现在似乎不起作用。
我需要在for循环中增加一些bokeh功能吗?
<?php
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/page', function() { return view('page1'); })->name('home');
Route::get('/', function () {
return view('welcome');
});
我希望生成可以链接的图,并允许我在一个图表上用框或套索选择一些点,并在其他图表上突出显示这些点。但是,这些图只能让我选择一个没有链接行为的图。
答案 0 :(得分:0)
解决方案
这似乎是一个菜鸟问题,但是我相信会有其他人遇到这个问题,所以这就是答案!!!
Bokeh通过引用数据源对象(columndatasource对象)来工作。您可以将数据帧完全传递到其中,然后在字形创建过程中调用显式的x和y值(例如,我的f.line,f.triangle等)。
因此,我将“源”移出了循环,以防止每次迭代都将其重置,而只是将df传递给它。然后,在循环中,为y值调用迭代索引+描述符字符串(USL,LSL,均值),为我的x值调用“索引”。
我添加了一个明确定义了“名称”的框选择工具,以便在选择框时,它仅选择我要选择的字形(即,不希望它选择我的常数值均值和规格限制行)。
另外,请注意,如果要输出到html或其他内容,则可能需要抑制笔记本中的输出,因为散景不喜欢打开重复的图。我没有在这里包括我的html输出解决方案。
就为循环生成的图添加链接的套索对象而言,我只能找到一个显式的框选择工具生成器,因此不确定是否可行。
所以这里是
#keep the source out of the loop to stop it resetting every time
Source = ColumnDataSource(df)
for c in cols:
TOOLS = "pan,wheel_zoom,box_zoom,reset,save"
f = figure(tools = TOOLS, width = w, plot_height = h, title = c + ' Run Chart',
x_axis_label = 'Run ID', y_axis_label = c)
f.line(x = 'index', y = c , source = Source, name = 'data')
f.triangle(x = 'index', y = c, source = Source, name = 'data')
#data mean line
f.line(x = 'index', y = c + '_mean', source = Source, color = 'orange')
#tolerance lines
f.line (x = 'index', y = c + 'USL', color = 'red', line_dash = 'dashed', line_width = 2, source = Source)
f.line (x = 'index', y = c + 'LSL', color = 'red', line_dash = 'dashed', line_width = 2, source = Source)
# Add BoxSelect tool - this allows points on one plot to be highligted on all linked plots. Note only the delta info
# is linked using name='data'. Again names can be used to ensure only the relevant glyphs are highlighted.
bxselect1 = BoxSelectTool(renderers=f.select(name='data'))
f.add_tools(bxselect1)
plots.append(f)
#tie the x_ranges together so that panning is linked between plots
for i in plots:
i.x_range = plots[0].x_range
forp = gridplot(plots, ncols = 2)
show(forp)