Как получить координаты PointDrawTool в боке? - PullRequest
0 голосов
/ 10 июля 2020

Я пытаюсь получить xy координаты точек, нарисованных пользователем. Я хочу иметь их в виде словаря, списка или pandas DataFrame.

Я использую Bokeh 2.0.2 в Jupyter . Там будет фоновое изображение (которое не является основной темой этого поста), а вверху пользователь создаст точки, которые я мог бы использовать в дальнейшем.

Ниже показано то место, куда мне удалось добраться (с некоторые фиктивные данные). И я прокомментировал несколько строк, которые, как мне кажется, указывают направление, в котором мне нужно было бы go. Но, похоже, я не понимаю asp этого.

from bokeh.plotting import figure, show, Column, output_notebook
from bokeh.models import PointDrawTool, ColumnDataSource, TableColumn, DataTable
output_notebook()
my_tools = ["pan, wheel_zoom, box_zoom, reset"]

#create the figure object
p = figure(title= "my_title", match_aspect=True,
           toolbar_location = 'above', tools = my_tools)

seeds = ColumnDataSource({'x': [2,14,8], 'y': [-1,5,7]}) #dummy data
renderer = p.scatter(x='x', y='y', source = seeds, color='red', size=10)
columns = [TableColumn(field="x", title="x"),
           TableColumn(field="y", title="y")]

table = DataTable(source=seeds, columns=columns, editable=True, height=100)

#callback = CustomJS(args=dict(source=seeds), code="""
#    var data = source.data;
#    var x = data['x']
#    var y = data['y']
#    source.change.emit();
#""")
#
#seeds.x.js_on_change('change:x', callback)

draw_tool = PointDrawTool(renderers=[renderer])
p.add_tools(draw_tool)
p.toolbar.active_tap = draw_tool

show(Column(p, table))

1 Ответ

0 голосов
/ 10 июля 2020

Из документации по адресу https://docs.bokeh.org/en/latest/docs/user_guide/tools.html#pointdrawtool:

Инструмент автоматически изменит столбцы в источнике данных, соответствующие значениям x и y глифа. Любые дополнительные столбцы в источнике данных будут дополнены объявленным empty_value при добавлении новой точки. Любые вновь добавленные точки будут вставлены в ColumnDataSource первого предоставленного средства визуализации.

Итак, просто проверьте соответствующий источник данных, seeds в вашем случае.

Единственная проблема вот если вы хотите точно знать, какая точка была изменена или добавлена. В этом случае самым простым решением было бы создать собственный подкласс PointDrawTool, который делает именно это. Кроме того, вы можете создать дополнительный «исходный» источник данных и сравнивать seeds с ним каждый раз при его обновлении.

...