Python Bokeh add a play button to a slider

百般思念 提交于 2019-12-24 00:58:53

问题


my following visualization needs a play button to automatically go through the values on the slider and loop when reaches the end. Is there a way to achieve that? Thanks.

The expacted outcome is like the graph on this link: https://demo.bokeh.org/gapminder

# Bokeh Visualisation (0.12.7)

from bokeh.charts import Scatter, output_file, show
from bokeh.plotting import figure, output_file, show, ColumnDataSource
from bokeh.io import output_file, show
from bokeh.layouts import layout, widgetbox, column, row
from bokeh.models import Toggle, BoxAnnotation, NumeralTickFormatter, CategoricalColorMapper
from bokeh.models import HoverTool
from bokeh.models.widgets import RadioButtonGroup, Slider
from bokeh.models.callbacks import CustomJS

dataset = {'x':[0,1,2],'y':[0,1,2], 'x_filter':[0,1,2]}

source2 = ColumnDataSource(data=dataset)


p2 = figure(plot_width=600, plot_height=600, 
            x_range=(-5,50), y_range=(-5,10))

p2.scatter('x', 'y', source=source2,
          size=15,
          alpha=0.8, 
          line_color=None)

p2.title.text = 'old title'

# add callback to control 
callback = CustomJS(args=dict(p2=p2, source2=source2), code="""

            var slider_value = cb_obj.value;
            var data = source2.data;            
            x = data['x']
            x_filter = data['x_filter']
            y = data['y']

            for (i = 0; i < x.length; i++) {
                x[i] = x_filter[i]+slider_value
            }

            p2.title.text = 'new title'

        source2.change.emit();

        """)

slider = Slider(start=0, end=50, value=0, step=5, title="test", callback=callback)


show(column(widgetbox(slider),p2))

回答1:


You can find the codes of all the apps on the github of bokeh, here is the gapminder https://github.com/bokeh/bokeh/blob/master/examples/app/gapminder/main.py

you are looking for that (that's using a bokeh server):

def animate_update():
    year = slider.value + 1
    if year > years[-1]:
        year = years[0]
    slider.value = year


def slider_update(attrname, old, new):
    year = slider.value
    label.text = str(year)
    source.data = data[year]

slider = Slider(start=years[0], end=years[-1], value=years[0], step=1, title="Year")
slider.on_change('value', slider_update)


def animate():
    if button.label == '► Play':
        button.label = '❚❚ Pause'
        curdoc().add_periodic_callback(animate_update, 200)
    else:
        button.label = '► Play'
        curdoc().remove_periodic_callback(animate_update)

button = Button(label='► Play', width=60)
button.on_click(animate)


来源:https://stackoverflow.com/questions/46420606/python-bokeh-add-a-play-button-to-a-slider

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!