You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:11:08