Python 使用taptool更新bokeh绘图中的颜色映射器

Python 使用taptool更新bokeh绘图中的颜色映射器,python,bokeh,Python,Bokeh,我需要根据用户可以选择的变量更改多边形的颜色贴图。我可以更新颜色,但如果使用TapTool选择一个多边形,则会显示初始颜色贴图: from bokeh.plotting import figure, curdoc from bokeh.layouts import column, layout from bokeh.models import ColumnDataSource, LinearColorMapper, ColorBar, BasicTicker, Select from bokeh

我需要根据用户可以选择的变量更改多边形的颜色贴图。我可以更新颜色,但如果使用TapTool选择一个多边形,则会显示初始颜色贴图:

from bokeh.plotting import figure, curdoc
from bokeh.layouts import column, layout
from bokeh.models import ColumnDataSource, LinearColorMapper, ColorBar, BasicTicker, Select
from bokeh.palettes import Viridis256 as palette

palette.reverse()
TOOLS = "tap"
p = figure(title="Coloring Humidity", tools=TOOLS)

source = ColumnDataSource(dict(x=[[1, 3, 2], [3, 4, 6, 6]],
                               y=[[2, 1, 4], [4, 7, 8, 5]],
                               name=['A', 'B'],
                               humidity=[0, 1.0],
                               temperature=[10.0, 0.0]
                               )
                          )

color_mapper = LinearColorMapper(palette=palette, low=0, high=1)

pglyph = p.patches('x', 'y', source=source, fill_color={'field': 'humidity', 'transform': color_mapper},
                   alpha=1, line_width=2)

color_bar = ColorBar(color_mapper=color_mapper, label_standoff=12, border_line_color=None, location=(0, 0),
                     ticker=BasicTicker())
p.add_layout(color_bar, 'left')


def color_change(attr, old, new):
    cm = p.select_one(LinearColorMapper)
    if new == 'humidity':
        cm.update(low=0, high=1.0)
    elif new == 'temperature':
        cm.update(low=0, high=10)
    else:
        raise ValueError('unknown color')
    pglyph.glyph.fill_color['field'] = new
    p.title.text = 'Coloring {}'.format(new.title())


select = Select(value='humidity', options=['humidity', 'temperature'])
select.on_change('value', color_change)

l = layout([
    [select],
    [p]
])

curdoc().add_root(l)

在这个脚本中,如果我在“选择”小部件中选择“温度”,颜色将毫无问题地重新映射,但如果我随后使用taptool选择一个多边形,则选定和未选定多边形的颜色将返回湿度的颜色映射。我想我遗漏了什么,但我不知道是什么。

我想你只需要删除这行:

pglyph.glyph.fill_color['field']=new


更改回调中ColorMapper的低/高属性会导致数据重新进行颜色映射,因此您不必手动设置颜色。

我需要更改用于着色的变量,将多边形视为具有“温度”、“湿度”等变量的多边形,用户必须能够选择要着色的功能。我将把这个问题编辑成一个更具体的例子