qcustomplot绘制动态曲线_如何在推文里让你的曲线动起来?

微信公众号里的动图

在前天推文“狗追鸭子[1]”留言中,有同学学问推文中的动图是如何制作的。

关于动图的制作方法,在公众号里大家输入 动图? 便可以查询到原来的说明。

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

(1)动态信号波形

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

5191fe37c57bb86f52ac951d2ee0fd6d.gif

动态信号波形图

(2)逐步增多数据曲线

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

1d8427f5c08a119d86a5e77196977aab.gif

动态数据曲线

绘制动图方法

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

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

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

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

import matplotlib.pyplot as pltomiga = linspace(1, 5, 50)t = linspace(0, 20, 200)count=0for 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:emp%d.jgp'%count)    count = count+1

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

86817e512a6205f041324a89e96ed7db.gif

生成频谱动态增加的曲线

第二步 生成动图文件

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

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

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

下面是定义了一个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:empGIF'):        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[](self.imageDim "period")        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)

减少动图文件大小

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

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

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

816a8774844afe43b427a9ffced0558f.gif

movgear压缩GIF文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值