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

Python Bokeh使用stream数据更新vbar_stack失败求助

问题原因

你代码里的核心问题是x轴的FactorRange没有随新数据动态更新。初始化figure时,x_range用的是ds.data['x']的静态初始值,后续通过stream()添加新的x标签,但x轴的可选范围没同步更新,导致新的堆叠条形图无法显示在画布上。

修复方案

修改代码,把x_range设置为可动态更新的FactorRange,并在update函数里同步更新x轴的factors:

import numpy as np
from bokeh.models import ColumnDataSource, FactorRange
from bokeh.plotting import figure
from bokeh.layouts import column
from bokeh.server.server import Server

i = 2
ds = ColumnDataSource({"x": ['0'], "d1": [0], "d2": [0]})
colors = ['red', 'green']
    
def update():
    global i, p
    new_x = str(i)
    # 新增数据到数据源
    ds.stream({'x': [new_x], 'd1': [np.random.randint(1, 3)], 'd2': [np.random.randint(1, 3)]})
    # 更新x轴的可选范围,确保新标签能被识别
    if new_x not in p.x_range.factors:
        p.x_range.factors.append(new_x)
    i += 1

def bkapp(doc):
    global p
    # 初始化支持动态更新的分类轴范围
    p = figure(x_range=FactorRange(factors=ds.data['x']), height=250)
    p.vbar_stack(['d1', 'd2'], x='x', width=0.5, color=colors, source=ds)
    doc.add_root(column(p))
    doc.add_periodic_callback(update, 1000)

# 启动Bokeh服务器
if __name__ == '__main__':
    Server({'/': bkapp}).start()
关键修改点
  • 用FactorRange替代静态x_range,明确分类轴的可选值集合
  • 在update函数中,每次新增x标签后将其添加到p.x_range.factors,扩展x轴显示范围
  • 将figure对象p设为全局变量,确保update函数能访问并修改其x轴属性

内容的提问来源于stack exchange,提问作者코딩하는원숭이

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 05:36:07