2017-04-24 59 views
0

我正在尝试使用滑块来更新我的散景图。我发现使用熊猫数据框很难实现它(到目前为止没有找到任何示例)。 另一种方式是使用“columndatasource”(在论坛上找到一些例子),但仍然无法实现该功能。 所以我有两列,X轴是日期,Y轴是音量。我想根据滑块输入更改我的Y值。我能够看到情节,但滑块功能不起作用使用滑块的散点图更新

任何帮助将非常明显。

source = ColumnDataSource(data=dict(x=df2['Date'],y=df2['Vol'])) 
S1 = figure(plot_width=400,plot_height=400,tools=TOOLS1,title="Volume Per Day",x_axis_type="datetime") 
S1.line('x','y',source=source) 

callback_test = CustomJS(args=dict(source=source), code=""" 
var data = source.get('data'); 
var s_val = cb_obj.value 
x = data['x'] 
y = data['y'] 
console.log(cb_obj) 
for (i = 0; i < s_val; i++) { 
    y[i] = y[i]    
    } 
source.trigger('change'); 
""") 

slider = Slider(start=0, end= max_Vol, value=1, step=100,title="Vol Per Day",callback=callback_test) 
+0

当我从0到s_val时,你只是单独替换每个y [i],所以没有任何变化。 – Seb

+0

@Seb,任何想法如何实现它.. – MoChen

+0

在你的文章中,你说“我想改变我的Y值基于滑块输入。”,你到底想要你的Y值改变? – Seb

回答

1

您试图更新使用滑块绘制的数据范围。

这样做:

y = data['y'] 
for (i = 0; i < s_val; i++) { 
    y[i] = y[i]    
    } 

蟒当量将是,如果y是一些阵列长度> S_VAL:

for i in range(s_val): 
    y[i] = y[i] 

这仅仅通过替换从0到S_VAL-1的元素他们本身并没有改变列表的其余部分。

你可以做两件事情:

  • 更新显示的轴范围直接
  • 使用空源,你会从你现有的源代码基础上的滑块值

填写。

source = ColumnDataSource(data=dict(x=df2['Date'],y=df2['Vol'])) 
fill_source = ColumnDataSource(data=dict(x=[],y=[])) 
S1 = figure(plot_width=400,plot_height=400,tools=TOOLS1,title="Volume Per Day",x_axis_type="datetime") 
S1.line('x','y',source=fill_source) 

callback_test = CustomJS(args=dict(source=source,fill_source=fill_source), code=""" 
var data = source.data; 
var fill_data = fill_source.data; 
var s_val = cb_obj.value; 
fill_data['x']=[]; 
fill_data['y']=[]; 
for (i = 0; i < s_val; i++) { 
    fill_data['y'][i].push(data['y'][i]); 
    fill_data['x'][i].push(data['x'][i]);   
    } 
fill_source.trigger('change'); 
""") 
0

这里工作的例子希望你可以把它:)

from os.path import dirname, join 
import pandas as pd 
from bokeh.layouts import row, widgetbox 
from bokeh.models import ColumnDataSource, CustomJS 
from bokeh.models.widgets import DateRangeSlider,DatePicker,DateFormatter, DataTable, TableColumn, NumberFormatter 
from bokeh.io import curdoc 
from datetime import datetime,date 
import datetime 
df = pd.read_csv(join(dirname(__file__), 'test.csv')) 
df['dat'] = pd.to_datetime(df['date']) 
source = ColumnDataSource(data=dict()) 

def update(): 
current = df[(df['dat'] >= pd.to_datetime(slider.value[0])) & (df['dat'] <= pd.to_datetime(slider.value[1]))] 
    source.data = { 
    'opens'    : current.open, 
    'dates'   : current.date, 
    } 

slider = DateRangeSlider(title="Date Range: ", start=date(2010, 1, 1), end=date.today(), value=(date(2017, 9, 7),date.today()), step=1) 
slider.on_change('value', lambda attr, old, new: update()) 




columns = [ 
    TableColumn(field="dates", title="Date" ,formatter=DateFormatter()), 
    TableColumn(field="opens", title="open"), 


data_table = DataTable(source=source, columns=columns, width=800) 

controls = widgetbox(slider) 
table = widgetbox(data_table) 

curdoc().add_root(row(controls, table)) 

update() 

这里是使用背景虚化的服务filename.py的的test.csv文件

date,open 
951868800000,102 
951955200000,100.5 
952041600000,107.25 
952300800000,109.94 
952387200000,106 
952473600000,103 
952560000000,106.5 
952646400000,107.62 
952905600000,104 
952992000000,107.75 
953078400000,107.5 
953164800000,109 
953251200000,108.25 
953510400000,110 
953596800000,112.81 
953683200000,114.5 
953769600000,115.87 
953856000000,115.37 
954115200000,125 
954201600000,125.75 
954288000000,122.31 
954374400000,118.87 
954460800000,122.62 
954720000000,120 
954806400000,121.5 
954892800000,120.5 
954979200000,123.5 
955065600000,123.5 
955324800000,124.75 
955411200000,121.62 
955497600000,119.62 
955584000000,112.5 
955670400000,109.81 
955929600000,103.87 
956016000000,112.25 

运行代码数据