从散景图中清除数据点

时间:2019-07-17 07:42:12

标签: python python-3.x bokeh

我对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函数将并没有真正清除流数据源。如何清除流数据源以清除数字?

1 个答案:

答案 0 :(得分:1)

通过为plot_data分配一个新值,您只是在更改变量本身。引用了plot_data先前值的所有内容仍将具有该旧引用。 相反,请尝试更改数据源的data属性:

def clear_plot(event):
    plot_data.data = {k: [] for k in plot_data.data}