如何在PyPlot/Matplotlib中高效复用静态绘图元素生成连续动画帧?
解决方案
完全可以仅更新热图部分,不需要每帧重复绘制静态神经元示意图,核心思路是提前缓存静态内容、循环内仅替换热图数据即可,优化后运行速度会有数量级提升。
具体优化逻辑
- 把画布创建、神经元绘制逻辑移到循环外,仅执行1次,避免4000个神经元重复绘制的冗余开销
- 保留
imshow返回的热图对象,循环内仅更新该对象的数值数据,不需要每帧重建、销毁画布
优化后代码
using PyPlot # 循环外仅执行1次的初始化逻辑 f = figure(figsize=(4,3)) # 先绘制静态神经元示意图,只画一次 for l in cel2 plot(l[:,1], l[:,2], marker="None", linewidth=1) end # 初始化热图,拿到热图对象用于后续更新数据 # 如需固定色阶可添加vmin=minimum(lfp3), vmax=maximum(lfp3)参数 im_obj = imshow(lfp3[1,:,:], extent=[-700,700,-400,1200], origin="lower") # 循环仅更新热图和保存 for t=1:801 # 仅替换热图数据,无额外绘制开销 im_obj.set_data(lfp3[t,:,:]) # 生成文件名保存 nstring = lpad(t, 4, "0") nom = "tubuela-$nstring.png" savefig(nom, dpi=72) if mod(t,50) == 0 println("listos $t") end end # 所有帧处理完成后再关闭画布 close(f)
注意事项
如果你的热图数值范围跨帧差异较大,希望保持全局色阶统一避免画面跳变,可以在初始化imshow时固定vmin和vmax参数,示例如下:
im_obj = imshow(lfp3[1,:,:], extent=[-700,700,-400,1200], origin="lower", vmin=minimum(lfp3), vmax=maximum(lfp3))
内容的提问来源于stack exchange,提问作者wpkzz
相关产品推荐
相关产品推荐

