如何生成动态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动图?的主要内容,如果未能解决你的问题,请参考以下文章