Как создать слайдер масштабирования для анимации боке? - PullRequest
1 голос
/ 02 апреля 2019

Я хочу иметь виджет слайдера для увеличения и уменьшения анимации боке. Ползунок должен увеличивать масштаб до определенной точки на рисунке (например, (100,123)) и иметь максимальный и минимальный уровень масштабирования. Я использую curdoc () и сервер Bokeh.

Мне было интересно, как кто-то с большим опытом может сделать это.

спасибо

1 Ответ

0 голосов
/ 02 апреля 2019

Это очень простой пример, который вы можете настроить и улучшить. Разместите вашу точку интереса в середине, например. (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

...