我对Bokeh还是有些陌生,但遇到了一个我无法解决的问题。
我有一个散景图,以两个单独的图形可视化一些流数据。由于各种原因,图的用户可能希望在单击按钮时清除当前数据点的两个图。
清除数字的好方法是什么?我尚未找到一个好的解决方案。
我的代码如下:
#Defining plots
plot_data = ColumnDataSource(dict(x=[],y=[],z=[]))
p = figure(plot_height = 600, plot_width = 800,
x_axis_label = 'X',
y_axis_label = 'Y')
p2 = figure(plot_height = 600, plot_width = 800,
x_axis_label = 'X',
y_axis_label = 'Z')
doc = curdoc()
数据源正在异步循环中更新:
async def loop():
while True:
data = await socket.recv_pyobj()
new_data = get_last_data(data)
#update ColumnDataSource
doc.add_next_tick_callback(partial(update,new_data))
doc.add_root(column(gridplot([p,p2], plot_width=1000)))
try:
testloop = IOLoop.current()
testloop.spawn_callback(loop)
except KeyboardInterrupt:
testloop.close()
当新的数据点出现在流中(解析为数据帧)时,通过以下功能更新ColumnDataSource
def update(new_data):
input_data = dict(x=new_data['x'], y=new_data['y'], z=new_data['z'])
plot_data.stream(input_data, rollover=500)
我最初的想法是通过单击按钮清除数字:
#Defining button for clearing plot
button = Button(label="CLEAR PLOT", button_type="danger")
def clear_plot(event):
plot_data = ColumnDataSource(dict(x=[],y=[],z=[]))
button.on_event(ButtonClick,clear_plot)
这是行不通的,如果我正确理解stream
方法,这就是问题的核心,因为新数据不断被追加到源中,并且上述clear_plot
函数将并没有真正清除流数据源。如何清除流数据源以清除数字?
答案 0 :(得分:1)
通过为plot_data
分配一个新值,您只是在更改变量本身。引用了plot_data
先前值的所有内容仍将具有该旧引用。
相反,请尝试更改数据源的data
属性:
def clear_plot(event):
plot_data.data = {k: [] for k in plot_data.data}