【问题标题】:Using bokeh slider to filter data on a plot使用散景滑块过滤绘图上的数据
【发布时间】:2020-07-05 20:43:21
【问题描述】:

我有一个脚本,可以绘制数据集中化合物之间的结构相似性。我想合并 4 个散景滑块来过滤显示滑块正确的化合物。问题是我不熟悉使用散景并寻求建议。我已将滑块添加到我的绘图中,但无法使用新过滤器更新绘图。我希望 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 和散景 2.0.2

【问题讨论】:

    标签: python-3.x slider bokeh


    【解决方案1】:

    不确定这是否是答案,但您可以尝试一件事: weight = slider.value --> 您将回调中的值设为“新”,无需将其从滑块中拉出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-30
      • 1970-01-01
      • 1970-01-01
      • 2019-02-15
      • 2018-03-07
      • 1970-01-01
      • 1970-01-01
      • 2021-02-02
      相关资源
      最近更新 更多