如何通过簇标签更新 Bokeh select 菜单

How to make Bokeh select menu update by cluster label

我一直在研究如何使用 Bokeh select 小部件来更新我正在处理的散点图的可视化效果。我希望能够从菜单中 select 一个集群标签,然后属于该集群的点将变为彩色,而所有其他点均为灰色。我认为我真的很接近,但无论出于何种原因,我的图表都不会更新。有人可以帮忙吗?希望你今天过得愉快:)

import pandas as pd
from bokeh.io import output_file, show, output_notebook, save
from bokeh.models import ColumnDataSource, Select, DateRangeSlider
from bokeh.plotting import figure, show
from bokeh.models import CustomJS 
from bokeh.layouts import row,column
import random

#generate random points and cluster labels for data
x = [random.randint(0,50) for i in range(200)]
y = [random.randint(0,50) for i in range(200)]
rand_clusters = [random.randint(0,30) for i in range(200)]

df = pd.DataFrame({'x_coord':x, 'y_coord':y,'cluster labels':rand_clusters})

clusters = [str(i) for i in range(len(df['cluster labels'].unique()))]

cols1 = df[['cluster labels','x_coord', 'y_coord']]
cols2 = cols1[cols1['cluster labels'] == '0']

Overall = ColumnDataSource(data=cols1)
Curr = ColumnDataSource(data=cols2)


callback = CustomJS(args=dict(source=Overall, sc=Curr), code="""
var f = cb_obj.value
sc.data['x_coord']=[]
sc.data['y_coord']=[]
for(var i = 0; i <= source.get_length(); i++){
    if (source.data['cluster labels'][i] == f){
        sc.data['x_coord'].push(source.data['x_coord'][i])
        sc.data['y_coord'].push(source.data['x_coord'][i])
    }
}   
   
sc.change.emit();
""")

menu = Select(options=clusters, value='0', title = 'Cluster #')  

bokeh_p=figure(x_axis_label ='X Coord', y_axis_label = 'Y Coord', y_axis_type="linear",x_axis_type="linear") #creating figure object 
bokeh_p.circle(x='x_coord', y='y_coord', color='green', source=Curr) # plotting the data using glyph circle

menu.js_on_change('value', callback)
layout=column(menu, bokeh_p) 
show(layout)


编辑:我发现了这个问题,我正在为我是如何错过它而大惊小怪:这是 DF(整数)中的 rand_clusterscluster labels 之间的简单数据类型不匹配来自集群(它们是字符串)。由于JS比较两者是为了更新Curr,所以从来没有出现'True'的情况。只需替换为 rand_clusters = [str(random.randint(0,30)) for i in range(200)]。将此标记为已解决。

我发现了这个问题,我正在为我是如何错过它而大吃一惊:这是 DF 中的 rand_clusters(它们是整数)和来自簇的簇标签(它们是字符串)。由于 JS 比较两者是为了更新 Curr,所以从来没有 'True' 条件。只需替换为 rand_clusters = [str(random.randint(0,30)) for i in range(200)]。将其标记为已解决。