Python matplotlib包和gif包生成gif动画实战对比

目录
  • 前言
  • gif包概述
  • 动画原理
  • gif包解读
    • options类
    • frames函数
    • save函数
  • gif包生成gif动画实践
  • 以心形曲线为例比较gif包和animation模块实现动画的差异
    • gif包的实现方式
    • 比较结果
  • 总结

前言

使用matplotlib生成gif动画的方法有很多,一般常规使用matplotlib的animation模块的FuncAnimation函数实现。

在matplotlib官网看到了第三方动画包gif的介绍。

gif包概述

gif包是支持 Altair, matplotlib和Plotly的动画扩展。

gif依赖PIL,即pillow,要求Pillow>=7.1.2。

安装gif包,pip install gif

动画原理

所有动画都是由帧(frame)构成的,一帧就是一幅静止的画面,连续的帧就形成动画。我们通常说帧数,简单地说,就是在1秒钟时间里传输的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次,通常用fps(Frames Per Second)表示。

制作动画的关键:如何生成帧,每秒多少帧。

gif包解读

gif包非常简洁,只有一个单独的文件gif.py,文件主要包含options类、frames和save两个函数。

options类

提供精简版 的Altair, matplotlib和Plotly的保存或输出设置。以matplotlib为例,提供以下设置。

  • dpi (int): The resolution in dots per inch
  • facecolor (colorspec): The facecolor of the figure
  • edgecolor (colorspec): The edgecolor of the figure
  • transparent (bool): If True, the axes patches will all be transparent

设置方法:gif.options.matplotlib["dpi"] = 300

原理:options在构造函数中创建matplotlib字典保存配置,随后传递给底层的matplotlib包。

frames函数

装饰器函数,通过对应包编写自定义绘图函数生成单帧图像。

save函数

根据帧序列生成动画。

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为所有帧—整个动画的持续时间。

gif包生成gif动画实践

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")

以心形曲线为例比较gif包和animation模块实现动画的差异

gif包的实现方式

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实现方式类似,更偏底层一些,这样遇到比较复杂的绘图时更灵活。

总结

到此这篇关于Python matplotlib包和gif包生成gif动画实战对比的文章就介绍到这了,更多相关matplotlib包和gif包生成gif内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 使用matplotlib创建Gif动图的实现

    目录 1.Matplotlib 简介 2.绘制动画正弦和余弦波 3.绘制曲面图 4.绘制回归图 1.Matplotlib 简介 数据可视化有助于更有效地讲述有关数据的故事并使其易于呈现.有时很难用静态图表来解释数据的变化,为此,我们将讨论matplotlib提供的名为“Animation”的动画库之一.以下是要涵盖的主题. 最流行的Python二维绘图库是Matplolib.大多数人从Matplotlib开始他们的探索性数据分析之旅.它可以轻松创建绘图.直方图.条形图.散点图等.与Pandas和

  • 如何利用Matplotlib库绘制动画及保存GIF图片

    前言 在自学机器学习或者是深度学习的过程中,有的时候总想把执行过程或者执行结果显示出来,所以就想到了动画.好在用 Python 实现动画有许多中方式,而大家熟知的 Matplotlib 库就可以实现. 本文的目的是对 Matplotlib 的动画实现手段做一个简单的说明. 绘制动画 import matplotlib.pyplot as plt import matplotlib.animation as animation 如果要让 matplotlib 实现动画功能的话,那么就要引入 ani

  • Python使用matplotlib创建Gif动图

    目录 1.Matplotlib 简介 2.绘制动画正弦和余弦波 3.绘制曲面图 4.绘制回归图 1.Matplotlib 简介 数据可视化有助于更有效地讲述有关数据的故事并使其易于呈现.有时很难用静态图表来解释数据的变化,为此,我们将讨论matplotlib提供的名为“Animation”的动画库之一.以下是要涵盖的主题. 最流行的Python二维绘图库是Matplolib.大多数人从Matplotlib开始他们的探索性数据分析之旅.它可以轻松创建绘图.直方图.条形图.散点图等.与Pandas和

  • Python matplotlib包和gif包生成gif动画实战对比

    目录 前言 gif包概述 动画原理 gif包解读 options类 frames函数 save函数 gif包生成gif动画实践 以心形曲线为例比较gif包和animation模块实现动画的差异 gif包的实现方式 比较结果 总结 前言 使用matplotlib生成gif动画的方法有很多,一般常规使用matplotlib的animation模块的FuncAnimation函数实现. 在matplotlib官网看到了第三方动画包gif的介绍. gif包概述 gif包是支持 Altair, matpl

  • python matplotlib包图像配色方案分享

    可选的配色方案: Accent, Accent_r, Blues, Blues_r, BrBG, BrBG_r, BuGn, BuGn_r, BuPu, BuPu_r, CMRmap, CMRmap_r, Dark2, Dark2_r, GnBu, GnBu_r, Greens, Greens_r, Greys, Greys_r, OrRd, OrRd_r, Oranges, Oranges_r, PRGn, PRGn_r, Paired, Paired_r, Pastel1, Pastel1_

  • python操作xlsx文件的包openpyxl实例

    Python扩展库openpyxl,可以操作07版以上的xlsx文件.可以创建工作簿.选择活动工作表.写入单元格数据,设置单元格字体颜色.边框样式,合并单元格,设置单元格背景等等. 需要增加可以颜色进入包安装目录的 your_pthon_path/site-packages/openpyxl/styles 修改colors.py文件下的 COLOR_INDEX = ( '00000000', '00FFFFFF', '00FF0000', '0000FF00', '000000FF', #0-4

  • 浅谈python编译pyc工程--导包问题解决

    利用python 编译工程,生产pyc文件 pyc文件好处:是一种二进制机器码,并且隐藏了源文件代码,但是有和py文件一样的功能(可以理解为效果一样) 所以可以将代码隐藏,便于商业价值,保护代码隐私还能和py文件一样可运行 import compileall compileall.compile_dir(r'/path') 所以在一些情况下,需将源文件工程批量生成pyc文件来隐藏代码. 上面代码即为 批量生成pyc的脚本更改path路径为根目录即可(根目录为最顶层目录需包括所有用到的文件) 运行

  • Python一键安装全部依赖包的方法

    requirements.txt用来记录项目所有的依赖包和版本号,只需要一个简单的pip命令就能完成. pip freeze >requirements.txt 然后就可以用 pip install -r requirements.txt 来一次性安装requirements.txt里面所有的依赖包,真是非常方便. 但是我最近发现了一个全新的Python包管理器,叫做pipenv,集合了所有编程语言的包管理器的优点,是kennethreitz大神的一个周末项目.它的工作方式就像Node.js里的

  • 详解python中的模块及包导入

    python中的导入关键字:import 以及from  import 1.import import一般用于导入包以及模块. 不过有个小问题: (1)当导入的是模块的时候是可以直接可以使用模块内的函数以及变量的, 比如说:包名为:com.test,在这个包底下有个模块为a.py,那么当其他包中的模块想要引入a模块的时候写法为 import com.test.a 在b.py中调用的方式为:com.test.a.(a中的函数或者变量),而不能直接写为a.(a中的函数名或者变量) (2)当导入的是包

  • python TCP Socket的粘包和分包的处理详解

    概述 在进行TCP Socket开发时,都需要处理数据包粘包和分包的情况.本文详细讲解解决该问题的步骤.使用的语言是Python.实际上解决该问题很简单,在应用层下,定义一个协议:消息头部+消息长度+消息正文即可. 那什么是粘包和分包呢? 关于分包和粘包 粘包:发送方发送两个字符串"hello"+"world",接收方却一次性接收到了"helloworld". 分包:发送方发送字符串"helloworld",接收方却接收到了两

  • Python代码一键转Jar包及Java调用Python新姿势

    需求背景 进击的Python 随着人工智能的兴起,Python这门曾经小众的编程语言可谓是焕发了第二春. 以tensorflow.pytorch等为主的机器学习/深度学习的开发框架大行其道,助推了python这门曾经以爬虫见长(python粉别生气)的编程语言在TIOBE编程语言排行榜上一路披荆斩棘,坐上前三甲的宝座,仅次于Java和C,将C++.JavaScript.PHP.C#等一众劲敌斩落马下. 当然,轩辕君向来是不提倡编程语言之间的竞争对比,每一门语言都有自己的优势和劣势,有自己应用的领

  • 关于Python 中的时间处理包datetime和arrow的方法详解

    在获取贝壳分的时候用到了时间处理函数,想要获取上个月时间包括年.月.日等 # 方法一: today = datetime.date.today() # 1. 获取「今天」 first = today.replace(day=1) # 2. 获取当前月的第一天 last_month = first - datetime.timedelta(days=1) # 3. 减一天,得到上个月的最后一天 print(last_month.strftime("%Y%m")) # 4. 格式化成指定形

  • Python虚拟环境的创建和包下载过程分析

    为什么使用虚拟环境 因为直接在真实环境进行安装python的包会造成环境之间的污染,因此需要创建虚拟环境,原则上每一个项目都需要有一个独属于自己的虚拟环境 Python项目的每次运行都需要启动环境,如果所有的模块都在一个环境中,不仅每次加载这些模块慢(尤其是开发过程中),并且依赖还可能相互冲突,甚至有些新引入的依赖会修改已安装模块的版本!这是很可怕的一件事. 因此使每个项目都拥有自己独有的环境很有必要.即使他们的依赖一致也要这样做. 创建虚拟环境 语法 python -m venv virtau

随机推荐