首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用bokeh滑块过滤绘图上的数据

使用bokeh滑块过滤绘图上的数据
EN

Stack Overflow用户
提问于 2020-07-06 04:43:21
回答 1查看 82关注 0票数 0

我有一个脚本,它将绘制数据集中化合物之间的结构相似性。我想合并4 bokeh滑块,以过滤化合物显示的滑块(S)是真的。问题是我刚开始使用bokeh并寻求建议。我已将滑块添加到我的绘图中,但无法使用新的过滤器更新绘图。我希望x和y轴值保持不变。我想使用类似于pandas .loc函数的滑块来过滤数据帧。

示例数据:

代码语言:javascript
复制
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

代码示例:

代码语言:javascript
复制
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)

我尝试过使用一个简单的更新函数,但它不起作用:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2020-07-23 01:18:52

不确定这是否是答案,但有一件事你可以尝试: weight = slider.value -->你有来自回调的值作为'new',不需要从滑块中拉出它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62746118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档