Python >> Tutoriel Python >  >> Python Tag >> Bokeh

Rappel du serveur Bokeh à partir des outils

Modifier par les mainteneurs du projet.

Il y a eu une certaine confusion et des régressions autour des sélections menant à la version 1.0. Pour toute version post 1.0, pour la plupart des cas d'utilisation, vous voudriez maintenant utiliser un rappel sur le 'indices' propriété de selected :

source.selected.on_change('indices', callback)

Ce type d'utilisation est maintenant continuellement et rigoureusement maintenu dans le cadre de tests d'intégration, et c'est ce qui devrait être utilisé pour toute version post 1.0 de Bokeh.

Le selected événement peut être lié à une fonction de mise à jour comme suit :

from bokeh.plotting import figure, curdoc
from bokeh.layouts import column
from bokeh.models import ColumnDataSource

TOOLS = "tap"
p = figure(title="Some Figure", tools=TOOLS)

source = ColumnDataSource(dict(x=[[1, 3, 2], [3, 4, 6, 6]],
                y=[[2, 1, 4], [4, 7, 8, 5]], name=['A', 'B']))

pglyph = p.patches('x', 'y', source=source, color=["firebrick", "navy"],
                                alpha=[0.8, 0.3], line_width=2)

def callback(attr, old, new):
    # The index of the selected glyph is : new['1d']['indices'][0]
    patch_name =  source.data['name'][new['1d']['indices'][0]]
    print("TapTool callback executed on Patch {}".format(patch_name))

pglyph.data_source.on_change('selected',callback)

curdoc().add_root(column(p))

Mise à jour pour les nouvelles versions de Bokeh. Testé sur la version 0.12.16

Comme @Karel Marik le mentionne, les glyphes ne peuvent pas mélanger l'affectation de valeurs directes et ColumnDataSource à la fois. Donc le code précédent ne fonctionne pas. Voici une mise à jour utilisant uniquement source qui comprend également le code pour imprimer les sélections multiples (faites avec shift + clic):

from bokeh.plotting import figure, curdoc
from bokeh.layouts import column
from bokeh.models import ColumnDataSource

TOOLS = ["tap"]
p = figure(title="Some Figure", tools=TOOLS)

source = ColumnDataSource(dict(
    x=[[1, 3, 2], [3, 4, 6, 6]],
    y=[[2, 1, 4], [4, 7, 8, 5]],
    name=['A', 'B'],color=["firebrick", "navy"],
    alpha=[0.8,0.3],line_width=[3,3]))

pglyph = p.patches('x', 'y', color="color", alpha="alpha",
                   line_width="line_width", source=source)

def callback(attr, old, new):
    # The index of the selected glyph is : new['1d']['indices'][0]
    selections = new['1d']['indices']
    print("Number of selections:{}".format(len(selections)))
    for index in selections:
        patch_name =  source.data['name'][index]
        print("TapTool callback executed on Patch {}".format(patch_name))

pglyph.data_source.on_change('selected',callback)

curdoc().add_root(column(p))