我正在学习将 Bokeh 用于交互式绘图工具。我遇到的问题类似于 Mandelbrot 图表中的情况,当放大它时,新区域被重绘。这需要 BokehJS 将新的 X 和 Y 范围发送回 Bokeh 后端以重新生成数据并将其发送回 BokehJS 以重绘。如何在 Bokeh 中做到这一点?
问问题
468 次
1 回答
2
我是 Bokeh 的项目负责人,但实际上我会建议您使用构建在 Bokeh 之上的Holoviews 。在纯 Bokeh 中执行此操作有点低级且乏味,因为 Bokeh 不公开单个统一范围更新,仅公开低级个别范围开始/结束更新。直接使用 Bokeh 需要大量代码来限制和合并事件,以避免大量不必要的重新计算。Holoviews,处于更高的水平,已经做到了这一切。然后甚至可以运行交互式 Mandlebrot 示例(就像任何标准 Bokeh 应用程序一样)。代码(减去分形计算部分)如下所示:
def get_fractal(x_range, y_range):
(x0, x1), (y0, y1) = x_range, y_range
image = np.zeros((600, 600), dtype=np.uint8)
return hv.Image(create_fractal(x0, x1, -y1, -y0, image, 200),
bounds=(x0, y0, x1, y1))
# Define stream linked to axis XY-range
range_stream = RangeXY(x_range=(-1., 1.), y_range=(-1., 1.))
# Create DynamicMap to compute fractal per zoom range and
# adjoin a logarithmic histogram
dmap = hv.DynamicMap(get_fractal, label='Manderbrot Explorer',
streams=[range_stream]).hist(log=True)
# Define styling options
options = hv.Store.options('bokeh')
options.Image = {
'style': Options(cmap='fire'),
'plot' : Options(logz=True, height=600, width=600,
xaxis=None, yaxis=None)
}
options.Histogram = {
'norm': Options(framewise=True),
'plot': Options(logy=True, width=200)
}
doc = BokehRenderer.server_doc(dmap)
doc.title = 'Mandelbrot Explorer'
于 2018-06-10T23:07:09.603 回答