如何在Jupyter中循环绘制时间序列片段,等待用户输入后再绘下一段?
解决Jupyter Notebook中逐段绘图并等待输入的问题
问题原因
Jupyter Notebook的单元格执行机制是代码块全部执行完毕后才统一渲染输出内容,包括Matplotlib图形。因此plt.show()无法实时弹出图形,必须等所有输入完成后才会一次性显示所有绘图结果。
解决方案
使用IPython的display模块强制实时显示图形,同时配合清理输出和关闭图形的操作,修改后的代码如下:
from IPython.display import display, clear_output import matplotlib.pyplot as plt segments = segments.iloc[0:5] input_list = [] # 避免用内置类型名`list`作为变量名 for idx, row in segments.iterrows(): f, ax = plt.subplots() ax.plot(time, yy) # 注意:使用当前循环行的时间范围,原代码取整列值会导致xlim设置错误 plt.xlim([row.start_time, row.end_time]) # 强制实时显示当前图形 display(f) # 获取用户输入 a = input("输入内容后回车继续:") input_list.append(a) # 清除当前输出,避免下一段图形叠加 clear_output(wait=True) # 关闭当前图形释放内存 plt.close(f)
关键说明
display(f):直接将当前创建的Figure对象实时输出到Notebook,绕过默认的延迟渲染机制。clear_output(wait=True):清除单元格当前输出区域,wait=True确保新内容准备好后再清除,避免画面闪烁。plt.close(f):关闭已显示的图形,释放内存,防止长时间循环导致内存占用过高。- 修正原代码中
xlim的错误:原代码使用segments.start_time取整列数据,应改为row.start_time获取当前循环行的时间范围。
内容的提问来源于stack exchange,提问作者Oiko
相关产品推荐
相关产品推荐

