我正在使用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