Bokeh垂直条形图width参数无效问题求助
解决Bokeh vbar datetime轴宽度无变化的问题
嘿,我太懂这个坑了!之前用Bokeh画时间轴条形图时也踩过一模一样的雷——问题核心出在datetime轴的单位逻辑上:当x轴是datetime类型时,Bokeh里的width参数单位是毫秒,而不是你直觉里的像素或时间天数。
你设置的width=100其实只代表100毫秒(也就是0.1秒),这么窄的宽度,放大后自然看起来像细线条,完全看不到条形的宽度!
解决方案:把宽度转换成对应时间的毫秒数
最直观的方法是用pandas.Timedelta来计算你需要的时间宽度,再转换成毫秒,这样就能精准匹配你的数据时间粒度。比如如果你的数据按天统计,就设置1天的宽度;如果按小时更新,就设置1小时的宽度。
修改后的代码如下:
from bokeh.io import show, output_file from bokeh.plotting import figure import pandas as pd df = pd.read_csv('Data/moviments.txt', delimiter='\t', encoding='utf-8') output_file("bar_basic.html") df['DT'] = pd.to_datetime(df['DT']) # 这里设置条形宽度为1天,可根据数据间隔调整(比如hours=1、minutes=30等) bar_width = pd.Timedelta(days=1).total_seconds() * 1000 # 把时间间隔转换成毫秒 p = figure(x_axis_type='datetime', plot_width=1230, plot_height=500, title='Moviments') p.vbar(x=df['DT'], top=df['SUM_IN'], width=bar_width, fill_alpha=0.8, color='green') p.vbar(x=df['DT'], top=df['SUM_OUT'], width=bar_width, fill_alpha=0.8, color='red') p.xgrid.grid_line_color = None show(p)
额外小提示
- 如果同一天有多条数据记录,可以把宽度调小(比如
days=0.5),避免条形互相重叠; - 要是数据按小时/分钟更新,直接修改
pd.Timedelta的参数即可,比如hours=1对应1小时宽度。
这样调整后,条形图的宽度就能正常显示啦!
内容的提问来源于stack exchange,提问作者Arnold Souza
相关产品推荐
相关产品推荐

