散景:检索 BasicTicker 的轴标记间隔

bokeh: retrieve axis ticker interval of BasicTicker

我正在尝试计算 x 轴上每个主要间隔的(横截面)平均值,为此我必须检索标签间隔。我的 X 轴 p.axis.ticker 代码是一个 BasicTicker 对象。这个对象有一个 base=10mantissas=[1, 2, 5].

我在 x 轴上看到标签以 20 个单位的间隔显示(这个数字是我想要的),但另一个复杂的问题是该数字是动态的。用于 X 轴的变量可以更改,因此间隔会因缩放而自动更改(例如,一些变量在 0.1-0.5 范围内,其他变量在 5-10 范围内)。出于这个原因,我需要访问区间变量。

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

axis_map = {
    "Return": "ret",
    "Holding period": "holdp",
    "Data source": "source",
}
x_axis = Select(title="X Axis", options=sorted(axis_map.keys()), value="Holding period")
y_axis = Select(title="Y Axis", options=sorted(axis_map.keys()), value="Return")

source = ColumnDataSource(data=dict(x=[], y=[]))

p = figure(plot_height=600, plot_width=700, title="", sizing_mode="scale_both")
scatter = p.scatter(x="x", y="y", source=source, size=4, color="color", fill_alpha="alpha", marker="marker")

def update_data()
   ...
   interval = p.axis.ticker.*get_interval()*
   df['interval_group'] = df[x_name].apply(lambda x: interval*round(x/interval))
   y_avg = df.groupby('interval_group')[y_name].mean()
   source.data = dict(x=..,
                      y=..,
                      y_avg=y_avg
                      )

controls = [x_axis, y_axis]
for control in controls:
     control.on_change('value', lambda attr, old, new: update())

inputs = column(*controls, width=320, height=1000)
inputs.sizing_mode = "fixed"
l = layout([
    [inputs, p, h],
], sizing_mode="scale_both")
            
update()
            
doc = curdoc()
doc.add_root(l)
doc.title = "Test"

在 BokehJS 中,ContinuousTickerBasicTicker 的父 class)有一个抽象的 get_interval 方法 - 看起来这正是您所需要的。但是这个方法和使用它的任何东西都没有暴露在 Python 端。好吧,至少据我所知。

为了获得所需的值,我会在 Python 中重新创建 get_interval 方法的主体,或者创建一个自定义代码(或可能是一个轴),其中唯一的自定义行为是将计算值发送到 Python 端。