Боке - выберите страну на интерактивной карте - PullRequest
0 голосов
/ 01 июня 2018

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

from bokeh.models import ColumnDataSource, Patches
from bokeh.plotting import figure
from bokeh.layouts import row
from bokeh.io import curdoc
import pandas as pd
from bokeh.models.selections import Selection

x = [[5,2,4], [3,5,6], [6,9,7], [8,7,6]]
y = [[5,3,2], [6,5,8], [3,1,6], [1,2,1]]
country = ['A', 'A', 'B', 'B']
id = [0,1,2,3]

df = pd.DataFrame(data=dict(x=x, y=y, country=country, id=id))
source = ColumnDataSource(df)

p = figure(tools="tap")
renderer = p.patches('x', 'y', source=source)

def my_tap_handler(attr,old,new):
    indices = source.selected.indices
    country_name = source.data['country'][indices[0]]
    country_indices = df['id'][df['country'] == country_name]
    if len(source.selected.indices) == 1:
        new_indices = list(country_indices)
        source.selected = Selection(indices=new_indices)

renderer.data_source.on_change("selected", my_tap_handler)
curdoc().add_root(row(p, width=800))

Запуск в терминале: bokeh serve filename.py --show

...