2017-07-19 85 views
0

我第一次尝试在Web浏览器上进行交互式绘图。我画了一些圈子,并且当我点击其中一个圈子时想要一些交互(回调)。我按照给定的here的例子,但我没有不好......如何制作交互式散景图?

bokeh serve --show test.py启动脚本中,我看到五周界的情节,但在任何一个圆点击的时候,我没有看到任何打印输出命令控制台也不绘制第六个圆圈。预期行为:我看到五个圆圈,当我点击其中一个圆圈时,我希望打印输出(“测试”)并添加了第六个圆圈(在坐标60/60处)。

完全可能是它的错误工具?总之,这里是完整的代码(test.py):

from random import random 

from bokeh.layouts import column 
from bokeh.models import Button, TapTool 
from bokeh.palettes import RdYlBu3 
from bokeh.plotting import figure, curdoc 

# create a plot and style its properties 
p = figure(x_range=(0, 100), y_range=(0, 100), toolbar_location=None) 
p.border_fill_color = 'black' 
p.background_fill_color = 'black' 
p.outline_line_color = None 
p.grid.grid_line_color = None 
p.circle([10, 20, 30, 40, 50], [60, 70, 20, 40, 50], size=20, color="navy", alpha=0.5) 

def foo(): 
    print("test") 
    p.circle([60], [60], size=20, color="navy", alpha=0.5) 


taptool = p.select(type=TapTool) 
taptool.callback = foo 

# # put the button and plot in a layout and add to the document 
curdoc().add_root(column(p)) 

P.S:我希望能够点击圆圈,得到他们的坐标,并动态地两周界之间画线,我点击了一个又一个。

回答

0

当您想要添加/删除/修改绘图数据时,最好将数据放入ColumnDataSource对象中,该对象可以有回调。

from bokeh.layouts import column 
from bokeh.models import ColumnDataSource 
from bokeh.plotting import figure, curdoc 

p = figure(x_range=[0,100],y_range=[0,100],tools='tap') 

source = ColumnDataSource(data={'x':[10, 20, 30, 40, 50],'y':[60, 70, 20, 40, 50]}) 

p.circle(x='x',y='y',size=20,source=source) 

def foo(attr,old,new): 
    new_source_data = {'x':source.data['x']+[60],'y':source.data['y']+[60]} 
    source.data.update(new_source_data) 

source.on_change('selected',foo) 

curdoc().add_root(column(p))