散景:基于滑块

时间:2018-09-10 14:57:38

标签: javascript python dictionary bokeh

我正在尝试扩大绘图技巧,并开始与Bokeh玩游戏。

现在我想做些什么,在我看来似乎很简单,但是我似乎不知道该怎么做。

我有三个定时事件,每个事件有3分。现在,我想在地图上显示与滑块选择的时间相对应的不同点。

下面的代码是我到目前为止得到的,但是地图图不想更新。

import pandas as pd

from bokeh.io import show, output_notebook    
from bokeh.models import ColumnDataSource, HoverTool, LinearColorMapper    
from bokeh.tile_providers import CARTODBPOSITRON
from bokeh.plotting import figure, show
from bokeh.layouts import column, widgetbox
from bokeh.models import CustomJS, Slider

TOOLS = "pan,wheel_zoom,reset,save"

points = pd.DataFrame(data = {'x': [1, 2, 3, 1, 2, 3, 1, 2, 3], 
                              'y': [4, 5, 6, 5, 6, 4, 6, 4, 5],
                             'time': [1, 1, 1, 2, 2, 2, 3, 3, 3]})

visible_points = points[(points['time'] == 1)]

source_visible = ColumnDataSource(data=dict(x=visible_points['x'], y=visible_points['y'], time=visible_points['time']))
source_available = ColumnDataSource(data=dict(x=points['x'], y=points['y'], time=points['time']))

mapplot = figure(title="Slider Test Plot", tools=TOOLS, width=950, height=650)
mapplot.add_tile(CARTODBPOSITRON)
mapplot.circle(x="x", y="y", size=15, fill_color="blue", fill_alpha=0.2, source=source_visible)

slider = Slider(title='Time',
                value=1,
                start=1,
                end=3,
                step=1)

slider.callback = CustomJS(args=dict(source_visible = source_visible, source_available = source_available), code="""
        var time_val = cb_obj.value;
        // Get the data from the data sources
        var point_visible = source_visible.data;
        var point_available = source_available.data;
        // Update the visible data
        for(var i = 0; i < point_available.length; i++) {  
            if (point_available['time'][i] == time_val){
                point_visible.x = point_available['x'][i];
                point_visible.y = point_available['y'][i];
            }   
        }
        source_visible.change.emit();
    """)


layout = column(mapplot, slider)

show(layout)

任何反馈将不胜感激!

2 个答案:

答案 0 :(得分:1)

我认为这是因为您拼错了point_available.lenght ...

答案 1 :(得分:0)

几个小时后,我终于设法修复了滑块。 以下回调使其起作用:

slider.callback = CustomJS(args=dict(source_visible = source_visible, source_available = source_available), code="""
    var time_val = cb_obj.value;
    // Get the data from the data sources
    var point_visible = source_visible.data;
    var point_available = source_available.data;

    point_visible.x = []
    point_visible.y = []

    // Update the visible data
    for(var i = 0; i < point_available.x.length; i++) {  
        if (point_available.time[i] == time_val){
            point_visible.x.push(point_available.x[i]);
            point_visible.y.push(point_available.y[i]);
        }   
    }
    source_visible.change.emit();
""")