使用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
相关产品推荐
相关产品推荐

