重置 bokeh 图的命令是什么?

15

我有一个bokeh图形,其中工具栏有一个重置按钮。基本上,当我更新正在绘制的数据时,我想要“重置”这个图形。我该怎么做?

3个回答

5

更新:已经提交了一个关于这个功能的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 版本,没有内置函数可完成此操作。可以制作一个 自定义扩展程序 来实现此功能。但是,这需要一些工作、试验和对话。如果您想追求这个选项,我鼓励您去 公共邮件列表,那里更适合进行迭代协作和讨论,而不是在 SO 上。或者,您也可以在 项目问题跟踪器 中开启一个功能请求。

谢谢你的回答!我采纳了你的建议并提出了一个功能请求:https://github.com/bokeh/bokeh/issues/5071 - user1340654

2

以下是一个关于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网站上缺乏不同方式为不同小部件设置回调函数的示例。

1

我曾经尝试使用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))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接