TapTool «щелкает» по нескольким символам одновременно (многие символы расположены близко друг к другу)

#python #bokeh

#python #боке

Вопрос:

Я успешно создал гистограмму. Однако, поскольку существует очень много глифов прямо над и под друг другом, всякий раз, когда «щелчок» отправляется в TapTool, у нескольких глифов срабатывает инструмент tap tool, поэтому на новых вкладках открывается несколько изображений, а не только один глиф «ближайший к щелчку».

Как вы можете видеть на скриншотах, в представлении по умолчанию так много глифов, которые перекрываются, что если я просто щелкну мышью вниз, я, вероятно, нажму на несколько глифов, и именно поэтому tap tool срабатывает несколько раз (один раз за попадание глифа).). При увеличении становится очевидно, что это не гистограмма, а точечный график, устроенный так, чтобы выглядеть как гистограмма, где каждый символ представляет другое изображение.

Как мне принудительно использовать только «ближайший» глиф (или только первый глиф из списка глифов, выбранных taptool) для запуска его taptool?

уменьшенный масштаб

увеличенный размер

В Интернете не так много документации о том, как это сделать.

 imgs = ['http://1...', 'http://2...', 'http://3...']
url = "@imgs"
click_tool = TapTool(callback=OpenURL(url=url))
p.add_tools(click_tool)
  

Комментарии:

1. Я не думаю, что в настоящее время это возможно. По этому поводу есть проблема с Github, но она существует уже несколько лет … github.com/bokeh/bokeh/issues/1512

Ответ №1:

Просто слишком много глифов сжато на пиксель под вашим курсором мыши, поэтому все они будут реагировать на ваш щелчок мыши. Хорошим решением было бы подключить функцию обратного вызова к y-диапазону вашего графика, которая перерисует диаграмму с меньшим количеством символов. Таким образом, при увеличении масштаба внешние символы исчезнут с графика, и будут добавлены новые, которые ранее были невидимы. При некотором уровне масштабирования вам больше не придется фильтровать глифы, и все они будут соответствовать. Я имею в виду что-то вроде этого:

 plot.y_range.callback = CustomJS(args=dict(source=source), code=code)
  

Холст графика имеет фиксированную высоту в пикселях, поэтому при обратном вызове вам нужно будет поместить не более этого количества глифов на вашем графике (количество глифов = высота пикселя холста) Это означает одну горизонтальную полосу на высоту пикселя. Затем одним щелчком мыши должен быть выбран только один символ.