2017-04-04 60 views
0

我需要根據用戶可以選擇的變量更改多邊形的顏色映射。我可以更新顏色,但如果我選擇用TapTool一個多邊形然後出現初始彩色地圖:使用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選擇其中一個多邊形,則所選和未選多邊形的顏色將返回到溼度的顏色映射。我想我失去了一些東西,但我不知道是什麼。

回答

0

我想你只需要刪除行:

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

改變ColorMapper在回調的低/高屬性應該引起數據重彩映射,所以你不應該必須手動設置顏色。

+0

我需要更改用於着色的變量,將變量看作「溫度」,「溼度」等多邊形,用戶必須能夠選擇要着色的特徵。我將把這個問題編輯成一個更具體的例子 –