Я создал linear_cmap на основе значений в моем ColumnDataSource, который должен раскрасить маркеры на моей фигуре Bokeh. Это все работает как шарм.
Однако теперь я хочу отфильтровать данные в ColumnDataSource, для которого я использую CDSView Боке вместе с IndexFilter. Если на рисунке ничего не выбрано, все в порядке - отфильтрованные маркеры отображаются соответствующим цветом. Но когда я выбираю точку, то все маркеры вдруг окрашиваются по-разному. Эта проблема не возникает, когда не используется представление.
Что я делаю не так?
Вот минимальный рабочий пример, чтобы продемонстрировать, что я имею в виду:
from bokeh.palettes import Spectral10
from bokeh.transform import linear_cmap
from bokeh.io import show
from bokeh.models import ColumnDataSource, IndexFilter, CDSView, Circle, TapTool
import bokeh.plotting as bkpl
# some easy data
x = [1, 2, 3, 4, 5, 6, 7, 8, 9]
y = x
v = x
# create CDS and view
s = ColumnDataSource(data = {"x": x, "y": y, "v": v})
view = CDSView(source = s, filters = [IndexFilter([1, 2, 3, 4, 5, 7, 8])])
# create color map
cmap = linear_cmap("v", palette = Spectral10, low = 0, high = 10, nan_color = "white")
# everything plotting-related
tt = TapTool(behavior = "select")
tooltip = [("", "@v")]
fig = bkpl.figure(tools=[tt], tooltips = tooltip)
c = fig.circle(x = "x", y = "y", source = s, fill_color = cmap, line_color = cmap, size = 20, view = view)
c.selection_glyph = Circle(fill_color = cmap, fill_alpha = 1)
c.nonselection_glyph = Circle(fill_color = cmap, fill_alpha = 0.5, line_color = cmap)
# show plot
show(fig)
Наконец, вот иллюстрация проблемы: