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,提问作者코딩하는원숭이
相关产品推荐
相关产品推荐

