我正在学习使用Bokeh作为交互式绘图工具。我遇到的问题类似于Mandelbrot图表中的情况,当放大它时,新区域是重绘的。这需要BokehJS将新的X和Y范围发送回Bokeh后端以重新生成数据并将其发送回BokehJS以重绘。怎么能在Bokeh中完成? Bokeh库中的Mandelbrot示例(http://bokeh.pydata.org/tutorial/solutions/gallery/image.html)在重绘后不会刷新。
谢谢!
石纹
答案 0 :(得分:0)
我是Bokeh的项目主管,但我实际上会建议您为此转向构建在Bokeh之上的Holoviews。要在纯Bokeh中执行此操作有点低级且乏味,因为Bokeh不会暴露单个统一范围更新,只会进行低级别的单个范围开始/结束更新。直接使用Bokeh将需要大量代码来限制和合并事件以避免大量不必要的重新计算。 Holoviews,处于更高层次,已经完成了所有这些。然后甚至准备好运行interactive Mandlebrot example(就像任何标准的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'