Jupyter Notebook中卷积动画绘图不流畅,逐帧显示问题求助
如何让Jupyter Notebook中的卷积动画流畅运行?
嘿,我太懂你这种逐帧绘制导致动画卡顿的烦恼了!在Jupyter环境里手动逐帧更新画布效率极低,咱们换用matplotlib的动画模块就能轻松解决这个问题。先看看你提供的现有代码片段(我帮你补全了未写完的合理部分):
import numpy as np from matplotlib import pyplot as plt from scipy import signal as sp # 创建待卷积函数 t_ini = 0 t_final = 11 dt = 0.1 t = np.arange(t_ini, t_final, dt) expo = np.exp(-t) * np.piecewise(t, t >= 0, [1, 0]) t1 = np.arange(0, 10, 0.1) s = np.sin(t1) conv_ = sp.convolve(s, expo, 'full') # 补全卷积结果的时间轴 n_conv = np.arange(min(t1)+min(t), max(t1)+max(t)+dt, dt)
流畅动画的核心解决方案:使用FuncAnimation
FuncAnimation会自动优化帧渲染流程,避免逐帧刷新整个画布的冗余开销,是让动画流畅起来的关键。下面是完整的实现步骤:
设置Jupyter绘图后端
在代码开头添加魔法命令,确保动画能在Notebook内正常交互显示:%matplotlib notebook # 也可以用更现代的后端:%matplotlib ipympl完整的流畅动画代码
import numpy as np from matplotlib import pyplot as plt from scipy import signal as sp from matplotlib.animation import FuncAnimation # 初始化参数和卷积数据 t_ini = 0 t_final = 11 dt = 0.1 t = np.arange(t_ini, t_final, dt) expo = np.exp(-t) * np.piecewise(t, t >= 0, [1, 0]) t1 = np.arange(0, 10, 0.1) s = np.sin(t1) conv_ = sp.convolve(s, expo, 'full') n_conv = np.arange(min(t1)+min(t), max(t1)+max(t)+dt, dt) # 设置绘图画布和子图 fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(8, 6)) ax1.set_title('原始信号与滑动卷积核') ax2.set_title('卷积过程实时结果') ax2.set_xlabel('时间') ax2.set_ylabel('卷积值') # 初始化绘图对象(后续仅更新这些对象的数据) line_s, = ax1.plot(t1, s, label='原始信号') line_expo, = ax1.plot([], [], label='滑动卷积核', color='#ff4444') line_conv, = ax2.plot([], [], color='#00aa66') ax1.legend() # 固定轴范围,避免画面跳动和重复计算 ax1.set_xlim(-1, max(t1)+1) ax1.set_ylim(-1.2, 1.2) ax2.set_xlim(min(n_conv), max(n_conv)) ax2.set_ylim(min(conv_)-0.2, max(conv_)+0.2) # 定义每帧的更新逻辑 def update(frame): # 更新滑动卷积核的位置 shift = t1[frame] if frame < len(t1) else t1[-1] line_expo.set_data(t + shift, expo) # 更新已计算的卷积结果片段 current_length = frame + len(expo) line_conv.set_data(n_conv[:current_length], conv_[:current_length]) return line_expo, line_conv # 创建动画实例:控制帧率、循环逻辑 ani = FuncAnimation(fig, update, frames=len(t1), interval=50, blit=True) plt.tight_layout() plt.show()
关键优化点说明
blit=True:只更新画面中变化的部分,而非重绘整个画布,这是流畅度提升的核心- 固定轴范围:提前设置好轴的极限,避免每帧调整轴带来的画面跳动和额外计算
interval参数:控制每帧间隔(单位毫秒),50ms对应20帧/秒,是兼顾流畅度和清晰演示的合理值
如果需要保存动画文件,可以添加这行代码:
ani.save('convolution_animation.mp4', writer='ffmpeg', fps=20)
内容的提问来源于stack exchange,提问作者Daniel Daza
相关产品推荐
相关产品推荐

