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

使用Bokeh绘制实时折线图却显示空白图的问题求助

解决Bokeh实时折线图显示空白的问题

我来帮你排查下这个空白图的问题,你的代码里有几个关键问题导致图形无法正常显示,咱们一个个来修正:

1. 数据格式错误(核心问题)

你在update函数里生成的new数据格式不对:

  • np.random.rand(1,3)会生成二维数组(形状为(1,3)),还额外套了一层列表,最终source里的x和y会变成「包含二维数组的列表」,Bokeh无法正确解析这种嵌套结构的数据源。
  • 正确的做法是生成一维的随机数序列,不需要嵌套列表。

2. 缺少周期性回调触发

原代码末尾不完整,必须添加周期性回调函数,让Bokeh定时调用update来更新数据源,否则source永远是空的,自然显示空白。

修正后的完整代码

import numpy as np
from bokeh.models import ColumnDataSource
from bokeh.plotting import figure, curdoc

# 初始化空数据源
source = ColumnDataSource({'x': [], 'y': []})

def update():
    # 生成3个一维随机数(替代原来的二维数组)
    new_x = np.random.rand(3).tolist()  # 转成列表更直观,也可以直接用数组
    new_y = np.random.rand(3).tolist()
    # stream的格式要求:key对应数据源字段,值是一维序列
    new_data = {'x': new_x, 'y': new_y}
    source.stream(new_data)

# 创建绘图对象,保留你原来的x/y范围设置
p = figure(
    plot_width=800, plot_height=400,
    x_range=[0, 1], y_range=[0, 1],
    x_axis_label='x', y_axis_label='y'
)
# 绘制折线,可添加line_width让线条更明显
p.line(source=source, x='x', y='y', line_width=2)

# 添加周期性回调,每500毫秒更新一次(可根据需求调整间隔)
curdoc().add_periodic_callback(update, 500)

额外优化建议

如果你的需求是随时间推进的实时折线图(比如x轴为时间戳),可以把new_x改成递增的数值,同时让x轴范围动态适配:

import time
from bokeh.models import DataRange1d

# 初始化绘图时修改x_range为动态范围
p = figure(
    plot_width=800, plot_height=400,
    x_range=DataRange1d(),  # 自动适配x轴范围
    y_range=[0, 1],
    x_axis_label='时间', y_axis_label='y'
)

def update():
    current_time = time.time()
    # 每次添加1个数据点,用rollover限制保留的历史数据量
    new_data = {'x': [current_time], 'y': [np.random.rand()]}
    source.stream(new_data, rollover=100)  # 仅保留最近100个点,避免数据过载

内容的提问来源于stack exchange,提问作者NikosTikos

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:20:23