Python 根据Bokeh中的x_范围自动设置vbar线宽
我有一个Python 根据Bokeh中的x_范围自动设置vbar线宽,python,graph,bokeh,Python,Graph,Bokeh,我有一个vbar绑定到一个ColumnDataSource,它会根据一些小部件选择进行更新。如果我从线宽=5开始,我的初始数据看起来很棒。但是,当我更新图形时,x_范围会更新以适应更新的数据,并导致条的相对宽度发生变化 理想情况下,宽度应始终与显示的条数成比例。我试着查看x_范围和xaxis上的各种属性,看看是否可以获得范围并尝试自己计算宽度,但我没有找到任何有用的方法。我一直在到处找文件,什么都没有。有什么想法吗?在@bigreddot的帮助下,我终于找到了答案。结果证明我用错了房子。我需要使
vbar
绑定到一个ColumnDataSource
,它会根据一些小部件选择进行更新。如果我从线宽=5开始,我的初始数据看起来很棒。但是,当我更新图形时,x_范围
会更新以适应更新的数据,并导致条的相对宽度发生变化
理想情况下,宽度应始终与显示的条数成比例。我试着查看x_范围
和xaxis
上的各种属性,看看是否可以获得范围并尝试自己计算宽度,但我没有找到任何有用的方法。我一直在到处找文件,什么都没有。有什么想法吗?在@bigreddot的帮助下,我终于找到了答案。结果证明我用错了房子。我需要使用宽度,而不是线宽。由于我的x_范围
是一个datetime
范围,并且datetime
以毫秒为单位,因此我需要足够大的宽度才能正确显示。这需要在放大时设置比例宽度,因为宽度表示x_轴上的特定时段
由于我有一个函数可以更改列分组方式的频率
,并更新ColumnDataSource.data
,因此在更新时只需重新计算宽度
以下是工作代码:
def get_data(freq='MS'):
返回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']))
返回0.8*(maxdate mindate).total_seconds()*1000/len(source.data['date'])
f=图形(绘图宽度=550,绘图高度=400,x轴类型=“日期时间”)
f、 x_range.set(bounds='auto')
r=f.vbar(source=source,top='volume',x='date',width=get_width())
条形图glyph=f.renderers[-1]。glyph
handle=show(f,notebook\u 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)