如何为bokeh动画创建缩放滑块?

时间:2019-04-02 06:57:42

标签: python-3.x animation widget bokeh

我想要一个滑块部件来放大和缩小bokeh动画。滑块应缩放到图中的特定点(例如(100,123)),并具有最大和最小缩放级别。 我正在使用curdoc()和bokeh服务器。

我想知道有更多经验的人会怎么做。

谢谢

1 个答案:

答案 0 :(得分:0)

这是一个非常简单的示例,您可以进一步对其进行自定义和改进。将您的兴趣点放在中间,例如(50,50)并移动滑块。该代码适用于Bokeh v1.0.4

import numpy as np
from bokeh.plotting import figure, show, curdoc
from bokeh.models import Slider, CustomJS, Range1d
from bokeh.layouts import column

slider_zoom = Slider(title = 'Zoom', start = -12, end = 8, value = 0, step = 1)
zoom_value = slider_zoom.value

x = np.linspace(-40, 40, 200)
y = x

p = figure(title = "Zoom Slider", plot_height = 500, plot_width = 600, y_range = Range1d(start = -40, end = 40), background_fill_color = '#efefef')
r = p.line(x, y, color = "red", line_width = 1.5, alpha = 0.8)
r = p.circle(x, y, color = "blue", line_width = 0.5, alpha = 0.8)

last_value = None

def update(attr, old, new):
    global last_value
    if last_value is not None:
        if new > 0:
            if new > last_value:
                p.y_range.start = p.y_range.start + new
                p.y_range.end = p.y_range.end - new

                p.x_range.start = p.x_range.start + new
                p.x_range.end = p.x_range.end - new
            else:
                p.y_range.start = p.y_range.start - new
                p.y_range.end = p.y_range.end + new

                p.x_range.start = p.x_range.start - new
                p.x_range.end = p.x_range.end + new
        elif new < 0:
            if new < last_value:
                p.y_range.start = p.y_range.start + new
                p.y_range.end = p.y_range.end - new

                p.x_range.start = p.x_range.start + new
                p.x_range.end = p.x_range.end - new
            else:
                p.y_range.start = p.y_range.start - new
                p.y_range.end = p.y_range.end + new

                p.x_range.start = p.x_range.start - new
                p.x_range.end = p.x_range.end + new

    last_value = new

slider_zoom.on_change('value', update)

layout = column(p, slider_zoom)
curdoc().add_root(layout)

结果:

enter image description here