首页 > 解决方案 > RangeSlider 不适用于散点图

问题描述

是否可以使范围滑块与散点图一起使用?如果我将散点图更改为线图,滑块会起作用,但这对我不起作用,因为我无法将框选择工具与线图一起使用。下面的代码片段被简化以演示该问题。我怀疑嵌入式 JavaScript 是问题所在,但我可能错了,因为它与折线图配合得很好。谢谢。

from bokeh.io import show
from bokeh.models import CustomJS, RangeSlider, Column, Row
from bokeh.plotting import figure

x = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
y = [0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
scatter_plot = figure(width=250, plot_height=600)
scatter_plot.scatter(x, y)
callback = CustomJS(args=dict(y_range=scatter_plot.y_range), code="""
var start = cb_obj.value
y_range.start = start[0]
y_range.end = start[1]
""")
depth_slider = RangeSlider(width=250, show_value=False, start=-20, end=120, value=(20, 80), step=20, 
title="Y Scale")
depth_slider.js_on_change('value', callback)
layout = Column(Row(depth_slider), scatter_plot, )
show(layout)

标签: bokeh

解决方案


Python 和 JS 版本的 Bokeh 工作方式之间似乎存在一些竞争条件或差异。默认情况下,所有范围都是在需要时重新计算的DataRange1d类的实例。在这种情况下,由于某种原因,它会在您手动设置值后重新计算这些值。startend

要修复它,请从一开始就手动指定范围:

scatter_plot = figure(..., y_range=(20, 80))

推荐阅读