我有一个脚本,它将绘制数据集中化合物之间的结构相似性。我想合并4 bokeh滑块,以过滤化合物显示的滑块(S)是真的。问题是我刚开始使用bokeh并寻求建议。我已将滑块添加到我的绘图中,但无法使用新的过滤器更新绘图。我希望x和y轴值保持不变。我想使用类似于pandas .loc函数的滑块来过滤数据帧。
示例数据:
SMILES ChEMBL ID tsne-1 tsne-2 ROMol HBA HBD TPSA MolWt FracSP3 logP
0 CS(=O)(=O)Oc1ccc2c(c1)O/C(=C\C=C\c1ccccc1)C2=O CHEMBL1309068 22.827000 -1.223711 Mol 5 0 69.67 342.056195 0.055556 3.19740
1 Cc1ccccc1N1C(=O)NC(=O)/C(=C/C=C/Nc2ccccc2)C1=O CHEMBL1517559 -64.257385 -10.908683 Mol 6 2 78.51 347.126991 0.050000 3.13002
2 COC(=O)c1ccc(NC(=O)CSC2=Nc3ccccc3C3CC=NN23)cc1 CHEMBL1478002 -25.157650 11.880555 Mol 7 1 83.36 394.109961 0.200000 3.57880
3 O=C(CSc1ccc(Br)c2cccc(Cl)c12)Nc1ccc(S(=O)(=O)N... CHEMBL1440953 -49.698872 49.696178 Mol 6 2 88.16 566.914744 0.047619 6.24380
4 C[n+]1ccc(/C=C/c2c[nH]c3ccccc23)cc1.[I-] CHEMBL1485211 -64.390800 -43.769257 Mol 2 1 19.67 362.027996 0.062500 0.16680代码示例:
source = ColumnDataSource(data=dict(
x=new_df['tsne-1'],
y=new_df['tsne-2'],
desc=new_df['ChEMBL ID'],
hba=new_df['HBA'],
hbd=new_df['HBD'],
tpsa=new_df['TPSA'],
sp3=new_df['FracSP3'],
logp=new_df['logP'],
molwt=new_df['MolWt'],
svgs=svgs))
mapper1 = linear_cmap(field_name='molwt', palette=Paired[8],low=np.min(molwt), high=np.max(molwt))
s1 = figure(plot_width=500, plot_height=500, title='test')
s1.circle('x', 'y', size=5, source=source, line_color=mapper1,color=mapper1, fill_alpha=1, alpha=0.5)
color_bar = ColorBar(color_mapper=mapper1['transform'], width=8, location=(0,0))
s1.add_layout(color_bar, 'right')
slider1 = Slider(title='MolWt', start=molwt.min(), end=molwt.max(), step=200, value=1)
slider2 = Slider(title='HBA', start=np.min(hba), end=np.max(hba), step=5, value=1)
slider3 = Slider(title='HBD', start=np.min(hbd), end=np.max(hbd), step=5, value=1)
slider4 = Slider(title='TPSA', start=np.min(tpsa), end=np.max(tpsa), step=100, value=1)
l1 = column(slider1, slider2, slider3, slider4, s1)
show(l1)我尝试过使用一个简单的更新函数,但它不起作用:
def update_slider1(attr, old, new):
weight = slider.value
updated_df = new_df[[new_df['MolWt'] <= weight] & [new_df['MolWt'] >= weight-50]] #not working but left in to show desired filtering
new_data = {
x:updated_df['tsne-1'],
y:updated_df['tsne-2'],
desc:updated_df['ChEMBL ID'],
hba:updated_df['HBA'],
hbd:updated_df['HBD'],
tpsa:updated_df['TPSA'],
sp3:updated_df['FracSP3'],
logp:updated_df['logP'],
molwt:updated_df['MolWt'],
svgs:svgs
}
source.data = new_data
slider1.on_change('value',update_slider1)我相信使用CustomJS在我的情况下可以工作,但我不确定如何实现它。我见过使用CustomJS的示例,但我找不到与我的问题类似的示例。
我使用的是python 3.6和bokeh 2.0.2
发布于 2020-07-23 01:18:52
不确定这是否是答案,但有一件事你可以尝试: weight = slider.value -->你有来自回调的值作为'new',不需要从滑块中拉出它。
https://stackoverflow.com/questions/62746118
复制相似问题