为了账号安全,请及时绑定邮箱和手机立即绑定

Bokeh 从 TapTool 中获取选定的字形/注释

Bokeh 从 TapTool 中获取选定的字形/注释

凤凰求蛊 2022-12-20 16:08:05
对于我的项目,我需要在散景(线、多线和箭头)中添加和删除 glpyhs 和注释。我想让它尽可能具有交互性。因此,为了删除一个字形/注释,需要通过单击鼠标来选择它,然后例如使用按钮将其删除。最小的例子看起来像这样:import numpy as npimport randomfrom bokeh.plotting import figure, ColumnDataSourcefrom bokeh.models import Button, TapTool,Arrow,NormalHeadfrom bokeh.layouts import layout from bokeh.application import Applicationfrom bokeh.server.server import Serverfrom bokeh.application.handlers.function import FunctionHandlerplot = figure(plot_height=300, plot_width=600, x_range=(0, 8), y_range=(0, 11),                   title="Testplot", tools='save, reset, tap')Lay = layout(children=[])#adds the glyphs/annotaions to figuredef Click_action():    x = np.array((random.randrange(1,10),random.randrange(1,10)))    y = np.array((random.randrange(1,10),random.randrange(1,10)))    source = ColumnDataSource(data=dict(x = x,                                        y = y))    arro = Arrow(end=NormalHead(size=5, fill_color="#C0392B"),                 x_start=random.randrange(0,10),                 y_start=random.randrange(0,10),                 x_end=random.randrange(0,10),                 y_end=random.randrange(0,10),                 line_width=3,                 line_color="#C0392B")    plot.multi_line(xs=[[1,5],[1,1],[3,3],[5,5]],ys=[[5,5],[5,1],[5,1],[5,1]], color='blue', selection_color='red' )    plot.add_layout(arro)    plot.line(x='x',y='y', source = source,selection_color='red')def Click_delet():    """ Delete the selected Glyphs/Annotations"""def make_document(doc):    btn1 = Button(label="Click", button_type="success")    btn2 = Button(label="Click_delet", button_type="success")    btn1.on_click(Click_action)    btn2.on_click(Click_delet)    Lay.children.append(plot)    Lay.children.append(btn1)    Lay.children.append(btn2)    doc.add_root(Lay)我目前遇到的问题是:我怎样才能选择箭头?如何获取所有选定的字形和注释?(如果可能的话,没有 CoustomJS 回调,因为我不太了解 java)是否可以选择多行作为一个字形?我已经解决了如何从图中删除线条和箭头的问题。但是我需要存储在plot.renders和plot.center中的值才能删除它们并将它们链接到我项目中的不同类。
查看完整描述

1 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

  1. 注释在 Bokeh 中不是交互式的

  2. 请参阅下面的最小示例

但我需要存储在 plot.renders 和 plot.center 中的值才能删除它们并将它们链接到我项目中的不同类。

理想情况下,您的工作流程应该避免动态创建和删除 Bokeh 模型,尤其是低级别的模型,例如字形。如果您需要删除一个字形并添加一个具有新属性的新字形,请考虑只更改旧字形的属性。或者只是清除旧字形的数据以隐藏它。

from bokeh.io import curdoc

from bokeh.layouts import column

from bokeh.models import Button

from bokeh.plotting import figure, ColumnDataSource


line_ds = ColumnDataSource(dict(x=[0, 3, 7],

                                y=[1, 8, 2]))

multi_line_ds = ColumnDataSource(dict(xs=[[1, 5], [1, 1], [3, 3], [5, 5]],

                                      ys=[[5, 5], [5, 1], [5, 1], [5, 1]]))


p = figure(x_range=(0, 8), y_range=(0, 11), tools='save, reset, tap')


p.line('x', 'y', source=line_ds, selection_color='red')

p.multi_line('xs', 'ys', source=multi_line_ds, color='blue', selection_color='red')


b = Button(label="Delete selected", button_type="success")



def delete_rows(ds, indices):

    print(indices)

    if indices:

        print(ds.data)

        ds.data = {k: [v for i, v in enumerate(vs) if i not in set(indices)]

                   for k, vs in ds.data.items()}

        print(ds.data)



def delete_selected():

    delete_rows(line_ds, line_ds.selected.line_indices)

    delete_rows(multi_line_ds, multi_line_ds.selected.indices)



b.on_click(delete_selected)


curdoc().add_root(column(p, b))


查看完整回答
反对 回复 2022-12-20
  • 1 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信