Jupyter Lab 3中用Matplotlib实现不清理输出的动态实时绘图
Jupyter Lab 动态实时绘图实现方案
核心配置(解决%matplotlib widget模式不实时渲染的问题)
替换魔术命令后,绘图仅在循环全部结束才显示的核心原因是ipympl的前端扩展未完成匹配安装,完整配置步骤如下:
- 安装适配当前Jupyter Lab版本的ipympl库:
pip install ipympl - 安装对应版本的前端扩展:
jupyter labextension install @jupyter-widgets/jupyterlab-manager ipympl - 完全停止当前运行的Jupyter Lab服务进程,重新启动服务(仅刷新页面无法加载扩展更新)
可直接运行的实现代码
配置完成后,不需要执行任何清空输出的操作,即可实现逐帧更新绘图、同时保留tqdm进度条等其他输出内容的效果,逻辑和原Jupyter Notebook中的动态绘图方案完全兼容,仅替换绘图后端的魔术命令:
%matplotlib widget import numpy as np import matplotlib.pyplot as plt import time from tqdm.notebook import tqdm def pltsin(ax, colors=['b']): x = np.linspace(0,1,100) if ax.lines: for line in ax.lines: line.set_xdata(x) y = np.random.random(size=(100,1)) line.set_ydata(y) else: for color in colors: y = np.random.random(size=(100,1)) ax.plot(x, y, color) # 仅触发当前画布的重绘,不影响其他输出区域 fig.canvas.draw() fig,ax = plt.subplots(1,1) ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_xlim(0,1) ax.set_ylim(0,1) # 循环内同步运行tqdm进度条,验证输出不会被清空 for f in tqdm(range(5)): pltsin(ax, ['b', 'r']) time.sleep(1)
关键注意点
- 实现过程中禁止调用
IPython.display.clear_output(),这类操作会清空整个单元格的所有输出内容,无法满足保留其他输出的需求 - 若仍出现绘图延迟到循环结束才显示的问题,可运行
matplotlib.get_backend()确认当前后端是否为module://ipympl.backend_nbagg,返回值不符说明后端未加载成功,可检查ipympl与Lab扩展的版本匹配性,完成匹配后重启服务重试 - 这套实现的绘图更新是增量触发的,tqdm进度条、print文本、表格等其他输出内容都会正常保留在原位置,不会被绘图更新操作覆盖或清除
内容的提问来源于stack exchange,提问作者Hyperplane
相关产品推荐
相关产品推荐

