Python 什么';将命令设置为";重置";博克阴谋?

Python 什么';将命令设置为";重置";博克阴谋?,python,plot,jupyter,bokeh,Python,Plot,Jupyter,Bokeh,我有一个bokeh图,工具栏上有一个重置按钮。基本上,当我更新图形中正在绘制的数据时,我想“重置”图形。我如何才能做到这一点?更新:已提交此功能的PR。发布Bokeh0.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(t

我有一个bokeh图,工具栏上有一个重置按钮。基本上,当我更新图形中正在绘制的数据时,我想“重置”图形。我如何才能做到这一点?

更新:已提交此功能的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
开始,没有内置的函数来执行此操作。可以制作一个这样做的程序。然而,这需要一些工作、实验和对话。如果你想追求这个选择,我鼓励你选择更适合迭代协作和讨论的方法。或者,请随时使用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.plotting导入图的

从bokeh.models导入ColumnDataSource、CustomJS、RadioGroup
从bokeh.layouts导入gridplot
从bokeh.resources导入CDN
从bokeh.embed导入文件\u html
x0=范围(10)
x1=范围(100)
y0=[x0中i代表i]
y1=[i*2表示x1中的i][:-1]
图=图()
source1=ColumnDataSource(数据={“x”:[],“y”:[]})
source2=ColumnDataSource(数据={“x0”:x0,“x1”:x1,“y0”:y0,“y1”:y1})
p=图线(x='x',y='y',震源=震源1)
callback=CustomJS(args=dict(s1=source1,s2=source2,px=fig.x_范围,py=fig.y_范围),code=”“”
var d1=s1.get(“数据”);
var d2=s2.get(“数据”);
var val=cb_obj.active;
d1[“y”]=[];
变量y=d2[“y”+val];
var x=d2[“x”+val];
var min=数学最小值(…y);
var max=数学最大值(…y);
py.set(“开始”,最小值);
py.set(“结束”,最大值);
var min=数学最小值(…x);
var max=数学最大值(…x);
px.设置(“启动”,最小值);
px.设置(“结束”,最大值);

对于(i=0;i我一直在努力使它与Bokeh2.2.1一起工作,但是这个JS
p.reset.emit()
似乎不起作用

对我来说,有效的方法是手动将Figure
renderers
属性设置为回调函数中的空列表,通过单击()调用。这仅适用于运行Bokeh服务器,不过:

$bokeh serve——show example.py
示例.py

来自bokeh.layouts导入列
从bokeh.models导入按钮
来自bokeh.doc,图
p=图(工具=“重置、平移、滚轮缩放、套索选择”)
p、 圆圈(列表(范围(10)),列表(范围(10)))
def清除图(属性):
p、 渲染器=[]
b=按钮(标签=“清除打印”)
b、 单击时(清除打印)
curdoc().添加_根(列(p,b))

谢谢你的回答!我接受了你的建议,提出了一个功能请求: