2

我正在学习将 Bokeh 用于交互式绘图工具。我遇到的问题类似于 Mandelbrot 图表中的情况,当放大它时,新区域被重绘。这需要 BokehJS 将新的 X 和 Y 范围发送回 Bokeh 后端以重新生成数据并将其发送回 BokehJS 以重绘。如何在 Bokeh 中做到这一点?

4

1 回答 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 回答