Я нашел способ делать то, что мне нужно. Это кажется некрасивым и неэффективным, но это работает. Я создал второй CDS для LabelSet, а затем использовал JS для восстановления данных в этом CDS из основного CDS с использованием состояний CheckboxGroup. Не стесняйтесь отвечать, если у вас есть более чистый и элегантный способ сделать это.
source = ColumnDataSource(df)
lsource = ColumnDataSource(df)
active = list(range(len(df))
filter = IndexFilter(indices=active)
view = CDSView(source=source, filters=[filter])
p=figure(.....)
p.scatter(x='x', y='y', source=source, view=view)
labels = LabelSet(x='x', y='y', text='label', source=lsource)
p.add_layout(labels)
labelList = df['label'].astype(str).to_list()
labelSel = CheckboxGroup(labels=labelList, active=active)
callback = CustomJS(args=dict(src=source, lsrc=lsource, filt=filter), code='''
filt.indices = cb_obj.active;
src.change.emit();
var data=src.data;
var l=data['label'];
var x=data['x'];
var y=data['y'];
var ldata=lsrc.data;
var a=cb_obj.active;
var ll=[];
var lx=[];
var ly=[];
for(var i=0;i<a.length;i++){
ll.push(l[a[i]]);
lx.push(x[a[i]]);
ly.push(y[a[i]]);
}
ldata['label']=ll;
ldata['x']=lx;
ldata['y']=ly;
lsrc.change.emit();
''')
labelSel.js_on_change('active', callback)
layout = row(p, Spacer(width=20), labelSel)
show(layout)