以下是一个保持 Bokeh x 和 y 范围的参数化类的示例代码:
from bokeh.plotting import figure
from bokeh.models import Range1d, DataRange1d, CustomJS
from bokeh.layouts import column
from bokeh.io import show
from bokeh.models.widgets import Slider
class ParametrizedBokehPlot:
def __init__(self, x_range, y_range):
self.x_range = x_range
self.y_range = y_range
self.plot = figure(x_range=self.x_range, y_range=self.y_range)
self.x_range_slider = None
self.y_range_slider = None
def update_x_range(self, attr, old, new):
self.plot.x_range.start = new[0]
self.plot.x_range.end = new[1]
def update_y_range(self, attr, old, new):
self.plot.y_range.start = new[0]
self.plot.y_range.end = new[1]
def create_range_slider(self, range_name):
if range_name == 'x':
range_slider = Slider(title="X Range", start=self.x_range[0], end=self.x_range[1], value=(self.x_range[0], self.x_range[1]), step=0.1)
range_slider.js_on_change('value', CustomJS(args=dict(self=self), code="""
self.update_x_range(null, null, cb_obj.value);
"""))
elif range_name == 'y':
range_slider = Slider(title="Y Range", start=self.y_range[0], end=self.y_range[1], value=(self.y_range[0], self.y_range[1]), step=0.1)
range_slider.js_on_change('value', CustomJS(args=dict(self=self), code="""
self.update_y_range(null, null, cb_obj.value);
"""))
return range_slider
def add_range_sliders(self):
self.x_range_slider = self.create_range_slider('x')
self.y_range_slider = self.create_range_slider('y')
def show_plot(self):
layout = column(self.plot, self.x_range_slider, self.y_range_slider)
show(layout)
# 示例用法
x_range = (0, 10)
y_range = (0, 10)
plot = ParametrizedBokehPlot(x_range, y_range)
# 添加 x 和 y 范围滑块
plot.add_range_sliders()
# 显示绘图和滑块
plot.show_plot()
这个示例代码中的ParametrizedBokehPlot
类接受 x 和 y 范围作为输入,并创建一个 Bokeh 绘图对象。然后,它使用create_range_slider
方法创建 x 和 y 范围的滑块,并使用update_x_range
和update_y_range
方法来更新绘图对象的 x 和 y 范围。最后,add_range_sliders
方法将这些滑块添加到绘图的布局中,并使用show_plot
方法显示绘图和滑块。