将散景颜色映射器从分类更新为连续

Update Bokeh color mapper from categorical to continuous

如何在分类、线性和对数之间更新 Bokeh 中的颜色映射器?下面带有 circle.glyph.fill_color['transform'] = mapper 的代码在使用 bokeh serve 执行时不起作用。我评论了this question,但我还是想不通。谢谢

from bokeh.models import ColumnDataSource
from bokeh.plotting import figure
from bokeh.models import CategoricalColorMapper
from bokeh.models import LinearColorMapper
from bokeh.models import LogColorMapper
from bokeh.palettes import Set3
from bokeh.models import Select
from bokeh.io import curdoc
from bokeh.layouts import layout


x = [1, 2, 3, 4, 5, 7, 8, 9, 10, 20, 50]
y = x
z = list(map(str, x))

select_mapper = Select(
    title="ColorMapper",
    value="Categorical",
    options=['Categorical', 'Linear', 'Log'],
    )

mapper = CategoricalColorMapper(palette=Set3[12], factors=z)

source = ColumnDataSource(dict(x=x, y=y, z=z))

p = figure(plot_width=300, plot_height=300)

circle = p.circle(
    x='x', y='y',
    fill_color={'field': 'z', 'transform': mapper},
    source=source,
    size=50,
    )


def update(attrname, old, new):

    # Get the current slider values
    if select_mapper.value == 'Linear':
        mapper = LogColorMapper(palette="Viridis256")
    elif select_mapper.value == 'Log':
        mapper = LinearColorMapper(palette="Viridis256")
    else:
        mapper = CategoricalColorMapper(palette=Set3[12], factors=z)

    circle.glyph.fill_color['transform'] = mapper

    source.data = dict(x=x, y=y, z=z)


select_mapper.on_change('value', update)

curdoc().add_root(layout([select_mapper, p]))

至于如何更改映射器 - 尝试更改整个 属性 规范,而不仅仅是转换:

circle.glyph.fill_color = dict(field='z', transform=mapper)