我有一个散景图,工具栏中有一个重置按钮。基本上,我想"重置"当我更新我在图中绘制的数据时的数字。我怎么能这样做?
答案 0 :(得分:3)
更新:已为此功能提交了PR。 Bokeh 0.12.16
发布后,以下内容将起作用:
from bokeh.io import show
from bokeh.layouts import column
from bokeh.models import Button, CustomJS
from bokeh.plotting import figure
p = figure(tools="reset,pan,wheel_zoom,lasso_select")
p.circle(list(range(10)), list(range(10)))
b = Button()
b.js_on_click(CustomJS(args=dict(p=p), code="""
p.reset.emit()
"""))
show(column(p, b))
从Bokeh 0.12.1
开始,没有内置函数来执行此操作。可以制作custom extension来做到这一点。但是,这需要一些工作,实验和对话。如果你想选择这个选项,我建议你来public mailing list,它比SO更适合迭代协作和讨论。或者,请随时在project issue tracker
答案 1 :(得分:1)
使用radiogroup回调的示例,这是我在更改绘图时发现重置的最佳方法,只需获取数据范围并将其设置为范围:
from bokeh.plotting import Figure
from bokeh.models import ColumnDataSource, CustomJS, RadioGroup
from bokeh.layouts import gridplot
from bokeh.resources import CDN
from bokeh.embed import file_html
x0 = range(10)
x1 = range(100)
y0 = [i for i in x0]
y1 = [i*2 for i in x1][::-1]
fig=Figure()
source1=ColumnDataSource(data={"x":[],"y":[]})
source2=ColumnDataSource(data={"x0":x0,"x1":x1,"y0":y0,"y1":y1})
p = fig.line(x='x',y='y',source=source1)
callback=CustomJS(args=dict(s1=source1,s2=source2,px=fig.x_range,py=fig.y_range), code="""
var d1 = s1.get("data");
var d2 = s2.get("data");
var val = cb_obj.active;
d1["y"] = [];
var y = d2["y"+val];
var x = d2["x"+val];
var min = Math.min( ...y );
var max = Math.max( ...y );
py.set("start",min);
py.set("end",max);
var min = Math.min( ...x );
var max = Math.max( ...x );
px.set("start",min);
px.set("end",max);
for(i=0;i<=y.length;i++){
d1["y"].push(d2["y"+val][i]);
d1["x"].push(d2["x"+val][i]);
}
s1.trigger("change");
""")
radiogroup=RadioGroup(labels=['First plot','Second plot'],active=0,callback=callback)
grid = gridplot([[fig,radiogroup]])
outfile=open('TEST.html','w')
outfile.write(file_html(grid,CDN,'Reset'))
outfile.close()
Bokeh网站严重缺乏为不同小部件设置回调的不同方法的示例。
答案 2 :(得分:0)
我一直在努力使其与Bokeh 2.2.1兼容,但是此JS p.reset.emit()
似乎不起作用。
对我有用的是手动将Figure renderers
属性设置为通过on_click()
调用的回调函数中的空列表。不过,这仅适用于正在运行的Bokeh服务器:
$ bokeh serve --show example.py
example.py :
from bokeh.layouts import column
from bokeh.models import Button
from bokeh.plotting import curdoc, figure
p = figure(tools="reset,pan,wheel_zoom,lasso_select")
p.circle(list(range(10)), list(range(10)))
def clear_plot(attr):
p.renderers = []
b = Button(label="Clear plot")
b.on_click(clear_plot)
curdoc().add_root(column(p, b))