Интерактивное евклидово расстояние точек на боке - PullRequest
0 голосов
/ 23 июня 2019

У меня есть две линии на графике, которые я могу перетаскивать, чтобы изменить их положение и длину. Я хотел бы рассчитать евклидово расстояние для них обоих и показать его на рисунке (может быть в заголовке, виджете или таблице). Расстояние должно меняться при изменении положения.

До сих пор я придумал это, но я не знаю, как определить положение точек на графике и рассчитать расстояние. Я думал, что смогу каким-то образом извлечь его из таблицы или получить формулу в столбце, но он перестал обновляться.

Я читал о обратных вызовах JS, но это меня довольно смущает.

output_file("tools_point_draw.html")
_tools_to_show = 'box_zoom,pan,save,hover,reset,tap'        

p = figure(x_range=(0, 10), y_range=(0, 10), tools=_tools_to_show,
           plot_width=862, plot_height=604,
           title='Lesion adjuster')

p.xgrid.visible = False
p.ygrid.visible = False
p.xaxis.visible = False
p.yaxis.visible = False


p.background_fill_color = 'white'

d_true = {'x': [2, 3], 'y': [4, 1], 
          'color': ['red', 'red'],
          'desc': ['true','true']}

d_pred = {'x': [1, 5], 'y': [6, 5], 
          'color': ['blue', 'blue'],
          'desc': ['pred','pred']}

df_true = pd.DataFrame(d_true)
df_pred = pd.DataFrame(d_pred)

df_all = pd.concat([df_true, df_pred])

source_true = ColumnDataSource(df_true)
source_pred = ColumnDataSource(df_pred)
source_all = ColumnDataSource(df_all)

renderer_true_s = p.scatter(x='x', y='y', source=source_true, color='color', size=15,
                             line_color='red', line_width=5)
renderer_true_l = p.line(x='x', y='y', source=source_true, color='red',
                         line_dash='dashed', line_width=10)

renderer_pred_s = p.scatter(x='x', y='y', source=source_pred, color='color', 
                            size=15, line_color='blue', line_width=5)
renderer_pred_l = p.line(x='x', y='y', source=source_pred, color='blue',
                         line_dash='dashed', line_width=10)

columns = [TableColumn(field="x", title="I am X"),
           TableColumn(field="y", title="I am Y"),
           TableColumn(field='color', title='color'),
           TableColumn(field='desc', title='desc')]
table = DataTable(source=source_all, columns=columns, editable=True, height=400)

draw_tool = PointDrawTool(renderers=[renderer_true_s, renderer_true_l,
                                     renderer_pred_s, renderer_pred_l], 
                          empty_value='black')
p.add_tools(draw_tool)
p.toolbar.active_tap = draw_tool

show(Column(p, table))

EDIT

Закрыто и переформулировано в другом вопросе: Обновление DataTable при событии Tap в Боке

...