在 Bokeh 中根据 x_range 自动设置 vbar line_width

Auto set vbar line_width based on x_range in Bokeh

我有一个 vbar 绑定到一个 ColumnDataSource,它会根据一些小部件选择进行更新。如果我从 line_width=5 开始,我的初始数据看起来很棒。但是,当我更新图表时,x_range 会更新以适应更新后的数据并导致条形的相对宽度发生变化。

理想情况下,宽度应始终与显示的条数成正比。我试着查看 x_rangexaxis 上的各种属性,看看我是否可以获得范围并尝试自己计算宽度,但我没有找到任何有用的东西。一直在环顾四周,文档什么也没有。有什么想法吗?

我终于在@bigreddot 的帮助下解决了这个问题。原来我用错了属性。而不是使用 line_width 我需要使用 width。由于我的 x_range 是一个 datetime 范围,而 datetimes 是以毫秒表示的,所以我需要足够大的宽度才能正确显示。这负责在放大时设置比例宽度,因为宽度代表 x_axis.

上的特定周期

因为我有一个函数可以更改 freq 我如何分组我的列并更新我的 ColumnDataSource.data,我只需要在我更新它时重新计算 width .

这是工作代码:

def get_data(freq='MS'):
    return pd.DataFrame(srs.groupby(pd.Grouper(freq=freq)).mean())

source = ColumnDataSource(data=ColumnDataSource.from_df(get_data()))

def get_width():
    mindate = min(source.data['date'])
    maxdate = max(source.data['date'])
    return 0.8 * (maxdate-mindate).total_seconds()*1000 / len(source.data['date'])

f = figure(plot_width=550, plot_height=400, x_axis_type="datetime")
f.x_range.set(bounds='auto')
r = f.vbar(source=source, top='volume', x='date', width=get_width())
bar_glyph = f.renderers[-1].glyph

handle = show(f, notebook_handle=True)

和我的更新功能:

def update_data(freq={'Quarter': 'QS', 'Month': 'MS', 'Week': 'W'}):
    source.data = ColumnDataSource.from_df(get_data(freq))
    r.glyph.width = get_width()
    push_notebook()

i = interact(update_data)