如何生成动态matlibplot动图?

Posted 卓晴

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何生成动态matlibplot动图?相关的知识,希望对你有一定的参考价值。

简 介: 本文给出了将matlibplot的图片组合成动图对应的子程序。

关键词 PlotGIF动图

 

§01 题来源


  天在推文 应用在机器学习中的聚类数据集产生方法 中的后面有人留言询问:

  • m0_60067953 :headm这个包怎么安装啊 还有pltgif = PlotGIF()也报错,没有这个函数

  下面将PlotGIF() 中对应的程序给出。

 

§02 件程序


一、子程序

  先在headm.py中给出了平时应用程序时常应用到连接。如下。

  对于PlotGIF()相关是其中的 tsdraw Python程序。因此在引入的时候,只需要将tsdraw 引入程序即可。 tsdraw在后面给出。

1、headm.py

import sys, os
sys.path.append(r'd:\\python\\teasoft')
STDFILE = open(r'd:\\python\\std.txt', 'a', 1)
sysstderr = sys.stderr
sysstdout = sys.stdout
sys.stderr = STDFILE
sys.stdout = STDFILE

from threading import Thread
import time, math, winsound, clipboard, random
from numpy import *

from tsmodule.tspdata   import *
from tsmodule.tspyt     import *
from tsmodule.tscmd     import *
from tsmodule.tsdopop   import *
from tsmodule.tsdraw    import *
import tsmodule.tsconfig
import matplotlib.pyplot as plt

def setpltrange(posx=2000, posy=550, width=800, height=640):
    cmfw = plt.get_current_fig_manager().window
    cmfw.setGeometry(posx, posy, width, height)

setpltrange()
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

2、tsdraw程序

  下面给出了tsdraw程序。注意,将其中的````printf 都替换成 print 即可。

  实现转换成将 matlibplot 的图片转换成GIF主要是其中 PlotGIF类。具体使用可以参见前面的应用在机器学习中的聚类数据集产生方法 中给出的应用举例即可。

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 appendbox(self, boxid, side=0):
        filename = os.path.join(self.gifdir, '%04d.jpg'%self.count)
        self.count = self.count + 1
        tspsaveimagebox(boxid, filename, side)
        self.imageDim.append(Image.open(filename))

    def appendrange(self, rangeid, side=0):
        filename = os.path.join(self.gifdir, '%04d.jpg'%self.count)
        self.count = self.count + 1
        tspsaveimagerange(rangeid, filename, side)
        self.imageDim.append(Image.open(filename))

    def save(self, giffile=r'd:\\temp\\gif1.gif', 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

        file_stats = os.stat(giffile)
        printf('%s size:%5.2fM\\a'%(giffile, file_stats.st_size / (1000*1000.0)))

def dop2gif(giffile=r'd:\\temp\\gif1.gif', gifid=0, period=50, last=50):
    dopfilename = tspgetresourcefile(gifid)
    if os.path.isfile(dopfilename) == False: return 1

    filedir = os.path.dirname(dopfilename)
    filedim = os.listdir(filedir)

    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

def dir2gif(giffile=r'd:\\temp\\gif1.gif', gifdir=r'd:\\temp\\gif', period=50, last=50):
    filedir = gifdir
    filedim = os.listdir(filedir)

    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

def filedim2gif(giffile=r'd:\\temp\\gif1.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

def files2gif(giffile=r'd:\\temp\\gif1.gif', filename=r'd:\\temp\\gif\\0000.jpg', number=0, period=50, last=50):
    if len(filename) == 0: return 0
    if number == 0: return 0

    removeflag = 0
    if number < 0:
        number = -number
        removeflag = 1

    filedir = os.path.dirname(filename)
    fileext = filename.split('.')[-1]
    imageDim = []

    for i in range(number):
        files = os.path.join(filedir, '%04d.%s'%(i, fileext))
        imageDim.append(Image.open(files))
        if removeflag == 1: os.remove(files)

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

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

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

def tempgifdir():
    gifdir = r'd:\\temp\\GIF'
    if os.path.isdir(gifdir) == False:
        os.mkdir(gifdir)
        return gifdir

    files = os.listdir(gifdir)
    for f in files:
        if os.path.isfile(f):
            os.remove(os.path.join(gifdir, f))

    return gifdir


二、相关博文

  与生成GIF文件相关的博文,还可以参见: 如何使用Python语言将测量数据曲线动起来? matplotlib转换成 GIF文件


■ 相关文献链接:

以上是关于如何生成动态matlibplot动图?的主要内容,如果未能解决你的问题,请参考以下文章

如何把视频片段做成动态图片

gif动图手机怎么制作?

Java图片或视频生成GIF动图,发送微信

Java图片或视频生成GIF动图,发送微信

gif动态图片生成器,多张图片组合后生成动图...

怎么把视频里的一小段视频做成动态图片?