如何使用Python语言将测量数据曲线动起来? matplotlib转换成 GIF文件

tsinghuazhuoqing 发表于 2021/12/27 00:19:19 2021/12/27
【摘要】 简 介: 本文就如何使用的Python中的Matplotlib绘制的图运动起来进行讨论。实际上是生成多个图片,将它们合成一个动图。编写了PlotGIF函数,将matplotlib绘制的图片存储,...

简 介: 本文就如何使用的Python中的Matplotlib绘制的图运动起来进行讨论。实际上是生成多个图片,将它们合成一个动图。编写了PlotGIF函数,将matplotlib绘制的图片存储,然后生成最终的GIF文件。最终展示形成动态的数据。

关键词 GIF动图matplotlib

 

§01 信公众号里的动图


  前天推文“狗追鸭子”留言中,有同学学问推文中的动图是如何制作的。关于动图的制作方法,在公众号里大家输入 动图? 便可以查询到原来的说明。

  推文中的动图是通过数据采集系统,包括可以读取数值的数字万用表、数字示波器、数字频谱仪以及特制的数据采集板卡等来采集。然后通过python语言绘制产生相应的动图。动图的风格包括以下两种:

1.动态信号波形

  仿照示波器显示波形的形式,将连续采集到的数据动态展示出来,反映了信号的变化特点。

动态信号波形图

动态信号波形图

2.逐步增多的数据曲线

  将采集到的数据从少到多绘制成逐步压缩的曲线,可以展示数据发展的趋势规律。
动态数据曲线

动态数据曲线

 

§02 制动图方法


  上两种方式主要是借助于两组命分成两步形成GIF动图。

第一步 绘制曲线,存储图片

  绘制曲线使用matplotlib中的plot命令完成。根据需要绘制的风格,可以选择按照一帧一帧地逐帧绘制,也可选择按照从少到多的绘制方式。

  下面的代码片段显示了绘制一组频率变化的正弦曲线的图像,并将它们逐帧存储在指定目录中,文件名称从0.jpg,变化到49.jpg。这是制作动图的第一步。

import matplotlib.pyplot as plt
omiga = linspace(1, 5, 50)
t = linspace(0, 20, 200)

count=0
for o in omiga:
    sint = sin(t * o)
    
    plt.clf()
    plt.plot(t, sint, label='Sinusoidal Curve')
    plt.xlabel('Time (s)')
    plt.ylabel('Amplitude (V)')
    plt.grid(True)
    plt.savefig(r'd:\temp\%d.jgp'%count)
    count = count+1

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

  根据matplotlib中的说明,存储图频的格式不包括BMP格式。可以生成JPG或者其他类型的图片。
生成频谱动态增加的曲线

生成频谱动态增加的曲线

第二步 生成动图文件

  有了逐帧图片,现在有很多独立的程序,或者在线的网站可以提供转换成GIF片的功能。其中一个小巧但功能比较强的软件工具是:movgear.exe 软件。它不仅可以将一组单张图图频转换成GIF图片,也可以完成相应的编辑功能。

  也存在很多python软件包可以帮助生成GIF图片,其中一个比较简便的就是是踹死PIL中的Image对象,在调用save()命令的时候生成GIF文件。在生成的同时可以指明每个图片显示的时间长度。

  下面的代码片段显示了应用Image将输入的一组文件名称所对应的图频转换成GIF文件的过程。

from PIL import Image
#------------------------------------------------------------
def filedim2gif(giffile=r'd:\temp\1.gif', filedim=[], period=50, last=50):
    if len(filedim) ==0: return 0

    imageDim = []
    for f in filedim:
        imageDim.append(Image.open(os.path.join(filedir, f)))

    duration = [period] * len(imageDim)
    duration[-1] = last

    imageDim[0].save(giffile,\
                     save_all=True,\
                     append_images=imageDim[1:],\
                     duration=duration,
                     loop=False)

    printf('Save GIF: %s'%giffile)
    return 0

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

完整的程序

  下面是定义了一个PlotGIF类来帮助存储plt对象中的文件以及最后生成GIF图片。其中在初始化的时候指明一个临时的目录来存储PLOT存储的JPG文件。使用append()命令来添加每一次 plt 调用 savefig 所产生的文件。最后使用 save() 命令生成最终的 GIF 文件。

#------------------------------------------------------------
# TSDRAW.PY
#------------------------------------------------------------
from tsmodule.tspdata   import *
from PIL import Image

#------------------------------------------------------------
class PlotGIF(object):
    def __init__(self, gifdir=r'd:\temp\GIF'):
        self.gifdir = gifdir
        self.imageDim = []
        self.count = 0

        if os.path.isdir(gifdir) == False:
            os.mkdir(gifdir)

    def infor(self, ):
        printf(self.gifdir, self.count)

    def __str__(self, ):
        return 'gifdir:%s'%self.dir

    def append(self, plt):
        filename = os.path.join(self.gifdir, '%04d.jpg'%self.count)
        self.count = self.count + 1
        plt.savefig(filename)
        self.imageDim.append(Image.open(filename))
        
    def save(self, giffile, period=100, last=100):
        duration = [period] * len(self.imageDim)
        duration[-1] = last

        self.imageDim[0].save(giffile,\
                              save_all=True,\
                              append_images=self.imageDim[1:],\
                              duration=duration,
                              loop=False)
        self.imageDim = []
        self.count = 0

        printf('Save GIF:%s'%giffile)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

 

§03 小动图文件大小


  果是在微信公众号中使用GIF文件,它有两个限制,一个是文件的大小不超过5 MBytes。第二个限制是动图中包含的图片不超过300张。

  如果文件的大小超过了5 M字节怎么办?

  一方面可以在使用 plt 时,每张图片的大小尽量减小。另外一方面可以使用 movgear软件 对GIF文件进行差分存储。这种模式是将GIF图片中每相邻的两张图片相减,存储时将变化量按照游程无损编码方式完成压缩存储。如果动图相邻两张图片非常相似,这种差分之后的存储就非常有效果。对于不复杂的 plt的图片使用差分存储可以很轻松获得5倍以上的压缩效果。

movgear压缩GIF文件大学

movgear压缩GIF文件大学

文章来源: zhuoqing.blog.csdn.net,作者:卓晴,版权归原作者所有,如需转载,请联系作者。

原文链接:zhuoqing.blog.csdn.net/article/details/104285291

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。