如何利用matplotlib生成gif动画,方法是什么
Admin 2022-09-03 群英技术资讯 664 次浏览
使用matplotlib生成gif动画的方法有很多,一般常规使用matplotlib的animation模块的FuncAnimation函数实现。
在matplotlib官网看到了第三方动画包gif的介绍。
gif包是支持 Altair, matplotlib和Plotly的动画扩展。
gif依赖PIL,即pillow,要求Pillow>=7.1.2。
安装gif包,pip install gif
所有动画都是由帧(frame)构成的,一帧就是一幅静止的画面,连续的帧就形成动画。我们通常说帧数,简单地说,就是在1秒钟时间里传输的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次,通常用fps(Frames Per Second)表示。
制作动画的关键:如何生成帧,每秒多少帧。
gif包非常简洁,只有一个单独的文件gif.py,文件主要包含options类、frames和save两个函数。
提供精简版 的Altair, matplotlib和Plotly的保存或输出设置。以matplotlib为例,提供以下设置。
设置方法:gif.options.matplotlib["dpi"] = 300
原理:options在构造函数中创建matplotlib字典保存配置,随后传递给底层的matplotlib包。
装饰器函数,通过对应包编写自定义绘图函数生成单帧图像。
根据帧序列生成动画。
def save(frames, path, duration=100, unit="milliseconds", between="frames", loop=True): """Save decorated frames to an animated gif. - frames (list): collection of frames built with the gif.frame decorator - path (str): filename with relative/absolute path - duration (int/float): time (with reference to unit and between) - unit {"ms" or "milliseconds", "s" or "seconds"}: time unit value - between {"frames", "startend"}: duration between "frames" or the entire gif ("startend") - loop (bool): infinitely loop the animation
frames即根据@gif.frame装饰的绘图函数生成的帧的序列,此处根据需要自定义。
duration即持续时间,由单位unit和模式between决定,默认为frames为帧间的时间间隔。
unit即持续时间单位,支持毫秒和秒,默认为毫秒。
between即持续时间计算模式,默认frames即duration为帧之间的时间间隔,startend模式时duration=duration /len(frames),即duration为所有帧—整个动画的持续时间。
import random from matplotlib import pyplot as plt import gif # 构造数据 x = [random.randint(0, 100) for _ in range(100)] y = [random.randint(0, 100) for _ in range(100)] #设置选项 gif.options.matplotlib["dpi"] = 300 #使用gif.frame装饰器构造绘图函数,即如何生成静态的帧 @gif.frame def plot(i): xi = x[i*10:(i+1)*10] yi = y[i*10:(i+1)*10] plt.scatter(xi, yi) plt.xlim((0, 100)) plt.ylim((0, 100)) # 构造帧序列frames,即把生成动画的所有帧按顺序放在列表中 frames = [] for i in range(10): frame = plot(i) frames.append(frame) # 根据帧序列frames,动画持续时间duration,生成gif动画 gif.save(frames, 'example.gif', duration=3.5, unit="s", between="startend")
import numpy as np import gif from matplotlib import pyplot as plt t = np.linspace(0, 6, 100) x = 16 * np.sin(t) ** 3 y = 13 * np.cos(t) - 5 * np.cos(2 * t) - 2 * np.cos(3 * t) - np.cos(4 * t) @gif.frame def plot_love(x, y): plt.figure(figsize=(5, 3), dpi=100) plt.scatter(x, y, 60, c="r", alpha=0.7, marker=r"$\heartsuit$") plt.axis("off") frames = [] for i in range(1, len(x)): of = plot_love(x[:i], y[:i]) frames.append(of) gif.save(frames, "love.gif", duration=80)
matplotlib 常规FuncAnimation函数实现方式
from matplotlib import pyplot as plt import matplotlib.animation as animation import numpy as np t = np.linspace(0, 6, 100) x = 16 * np.sin(t) ** 3 y = 13 * np.cos(t) - 5 * np.cos(2 * t) - 2 * np.cos(3 * t) - np.cos(4 * t) data=[i for i in zip(x,y)] def plot_love(data): x, y = data plt.scatter(x, y, 60, c="r", alpha=0.7, marker=r"$\heartsuit$") fig=plt.figure(figsize=(5, 3), dpi=100) plt.axis("off") animator = animation.FuncAnimation(fig, plot_love, frames=data, interval=80) animator.save("love.gif", writer='pillow')
matplotlib底层PillowWriter类实现方式
from matplotlib import pyplot as plt import matplotlib.animation as animation import numpy as np t = np.linspace(0, 6, 100) x = 16 * np.sin(t) ** 3 y = 13 * np.cos(t) - 5 * np.cos(2 * t) - 2 * np.cos(3 * t) - np.cos(4 * t) def plot_love(x,y): plt.scatter(x, y, 60, c="r", alpha=0.7, marker=r"$\heartsuit$") fig=plt.figure(figsize=(5, 3), dpi=100) plt.axis("off") writer = animation.PillowWriter(fps=15) with writer.saving(fig, "love1.gif"): for i in range(1, len(x)): of = plot_love(x[i], y[i]) writer.grab_frame()
通过比较可知gif包的实现方式和matplotlib中利用PillowWriter实现方式类似,更偏底层一些,这样遇到比较复杂的绘图时更灵活。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了python使用tkinter模块实现文件选择功能,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
支持向量机 (Support Vector Machine, SVM) 是一种监督学习技术,它通过根据指定的类对训练数据进行最佳分离,从而在高维空间中构建一个或一组超平面。本文将介绍通过SVM算法实现手写数字的识别,需要的可以了解一下
在公司做分布式深网爬虫,搭建了一套稳定的代理池服务,为上千个爬虫提供有效的代理,保证各个爬虫拿到的都是对应网站有效的代理IP,从而保
这篇文章主要介绍了Python数据分析之 Pandas Dataframe条件筛选遍历详情,查询Pandas Dataframe数据时,经常会筛选出符合条件的数据,关于其使用方式,需要的小伙伴可以参考一下下面文章内容
本文主要介绍了pytest中配置文件pytest.ini使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008