Tag Archives: 动画

本文由Mathematrix译自由Jake Vanderplas撰写的Matplotlib Animation Tutorial

Matplotlib 1.1 版新添加了一些非常帅的用来制作动画的工具,你可以在Matplotlib的Example页看到一些非常棒的例子(OldExample, Example)。在这里我与大家分享下我使用这些工具的一些经验。

基本动画

动画工具的中心是matplotlib.animation.Animation基类,这个类提供了动画功能的基础。两个主要接口则分别是imeAnimation和FuncAnimation,你可以在这里查看API文档。下面我说说怎么使用我认为最实用的FuncAnimation。

首先我们用FuncAnimation做一个基本的动画,这个动画可以在屏幕上动态显示正弦函数的图像。

  1. “””  
  2. matplotlib animation example  
  3.  
  4. author: jake vanderplas  
  5. email: vanderplas@astro.washington.edu  
  6. website: http://jakevdp.github.com  
  7. license: bsd  
  8. please feel free to use and modify this, but keep the above information. thanks!  
  9. “””  
  10.   
  11. import numpy as np   
  12. from matplotlib import pyplot as plt   
  13. from matplotlib import animation   
  14.   
  15. # first set up the figure, the axis, and the plot element we want to animate   
  16. fig = plt.figure()   
  17. ax = plt.axes(xlim=(0, 2), ylim=(-2, 2))   
  18. line, = ax.plot([], [], lw=2)   
  19.   
  20. # initialization function: plot the background of each frame   
  21. def init():   
  22.     line.set_data([], [])   
  23.     return line,   
  24.   
  25. # animation function.  this is called sequentially   
  26. def animate(i):   
  27.     x = np.linspace(0, 2, 1000)   
  28.     y = np.sin(2 * np.pi * (x - 0.01 * i))   
  29.     line.set_data(x, y)   
  30.     return line,   
  31.   
  32. # call the animator.  blit=true means only re-draw the parts that have changed.   
  33. anim = animation.funcanimation(fig, animate, init_func=init,   
  34.                                frames=200, interval=20, blit=true)   
  35.   
  36. # save the animation as an mp4.  this requires ffmpeg or mencoder to be   
  37. # installed.  the extra_args ensure that the x264 codec is used, so that   
  38. # the video can be embedded in html5.  you may need to adjust this for   
  39. # your system: for more information, see   
  40. # http://matplotlib.sourceforge.net/api/animation_api.html   
  41. anim.save(‘basic_animation.mp4′, fps=30, extra_args=['-vcodec', 'libx264'])   
  42.   
  43. plt.show()  

 

让我们一步一步来研究这个并看看下面将会发生什么。在引入几个必须的numpy和matplotlib库后,脚本开始设置这个plot:
Read More →

本文程序在Windows7 + python2.7 + wx2.9 + pygame1.9 下调试正常通过。 这几天在给一座桥写实时监控程序(众:你丫去年不就在写这玩意儿么,怎么今年又写开了……答:去年写的是个检测,就相当于给数据做了个皮肤,今年做的是监测,连着几百号传感器呢,技术含量不能同日而语……)。出于种种目的我终于说服项目组允许我拿python写这个程序,以前就很少写GUI程序,这下自己也纯属赶鸭子上架,结果没想到还遇到了个麻烦。 是这样的,桥上有个传感器,可以感应到有车辆从桥上经过,这个传感器可以记录到这个车的车速、加速度、轴重、轴距等等信息,然后工控机1受到这些数据后会向局域网广播,我写的程序跑在工控机2上,收到数据在屏幕显示就行了,这个过程倒是不难,只要下面几句就能完成:

  1. s=socket.socket(socket.af_inet,socket.sock_dgram)   
  2. s.setsockopt(socket.sol_socket,socket.so_reuseaddr,1)   
  3. socket.setdefaulttimeout(0.5)   
  4. ip=socket.gethostbyname(socket.gethostname())   
  5. d,a=s.recvfrom(90)   
  6. s.close()  

 

因为这个数据什么时候发过来并不知道,所以应该开个线程然后while循环这句d,a=s.recvfrom(90),当收到数据就出发个事件,但是我研究好久线程间通信、事件什么的也没弄出来,只好写了个轮循,就是收到数据就放到一个大家都能访问的空列表里,在画动画的时候不断检查这个列表长度,一旦列表长度大于0就从里边取数据,取一个删一个。这样写好像比较笨,再看了“小明明s à domicile”里写的设计模式后发现这个其实符合观察者模式,与其不断查这个列表不如在收数据这里调用画动画的函数,这样来通知效果应该会好些。说起来,在Python Essential Reference里有个生产者消费者模型,记得以前看操作系统原理看过,可惜没用上。 收上数据直接显示应该就行了吧,这个本来挺简单但是项目组要求这个显示一定要用个动画来显示,具体就是来个车要能看到一个格子里面有这个车的所有信息,然后这个格子要从屏幕下方移动到屏幕上方,定住;下一个移动到这个之后,如此循环,当屏幕上攒够4个就把最上面那个移走,整体往上顶一个,再把新的移上来,大致就是怎么个效果:

Record Read More →