estableciendo rangos de figuras usando TapTool en bokeh

En el siguiente ejemplo, tengo 2 diagtwigs de dispersión uno encima del otro. El comportamiento previsto es:

  • al hacer clic en un punto en el gráfico superior, el inferior se acerca a la región circundante
  • al hacer clic en un punto en el gráfico inferior, la ttwig inferior se acerca a la región circundante

Tengo el primer comportamiento que ejecutar, pero el segundo no parece funcionar: el x_range se restablece para cubrir todo el intervalo de los datos, ignorando la asignación xrange.start= en la callback.

 # test_data_a is a pandas dataframe containing columns "x" and "y" # test_data_b is a pandas dataframe containing columns "x" and "y" f1=figure(width=950, tools="xwheel_zoom,box_zoom,reset,tap", height=200) test_source1 = ColumnDataSource(data=dict(x=test_data_a.x, y=test_data_a.y)) test_source2 = ColumnDataSource(data=dict(x=test_data_b.x, z=test_data_b.z)) f1.circle("x", "y", fill_alpha=0.6, size=10, source=test_source1) f2=figure(width=950, tools="reset,tap") f2.circle("x", "z", fill_alpha=0.6, size=10, source=test_source2) cb_click_testtop = CustomJS(args=dict(ts1=test_source1, ts2=test_source2, xrange=f2.x_range, yrange=f2.y_range), code=""" index_selected=ts1.selected['1d'].indices[0] xmin=ts1.data['x'][index_selected]-0.5 xmax=ts1.data['x'][index_selected]+0.5 xrange.start=xmin xrange.end=xmax """) cb_click_testbot = CustomJS(args=dict(ts1=test_source1, ts2=test_source2, xrange=f2.x_range, yrange=f2.y_range), code=""" index_selected=ts2.selected['1d'].indices[0] xmin=ts2.data['x'][index_selected]-0.5 xmax=ts2.data['x'][index_selected]+0.5 xrange.start=xmin xrange.end=xmax """) f1.add_tools(TapTool(callback=cb_click_testtop)) f2.add_tools(TapTool(callback=cb_click_testbot)) both= gridplot([[f1], [f2]]) show(both) 

Otro ejemplo (más sencillo) se puede encontrar aquí , donde aparece el mismo problema incluso cuando se dibuja solo 1 gráfico.

Los rangos predeterminados de DataRange1d solo responden a los cambios de usuario para start y end cuando se configuran inicialmente . Posteriormente, un DataRange1d respeta el valor inicial, o siempre auto-rangos si no se estableció uno. Para hacer que este tipo de control explícito de rangos funcione, use un Range1d en Range1d lugar:

 p=figure(x_range=(0,5))