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

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会自动优化帧渲染流程,避免逐帧刷新整个画布的冗余开销,是让动画流畅起来的关键。下面是完整的实现步骤:

  1. 设置Jupyter绘图后端
    在代码开头添加魔法命令,确保动画能在Notebook内正常交互显示:

    %matplotlib notebook
    # 也可以用更现代的后端:%matplotlib ipympl
    
  2. 完整的流畅动画代码

    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:54:46