首页 > 代码库 > Python学习-使用matplotlib画动态多图
Python学习-使用matplotlib画动态多图
近期经常使用matplotlib进行数学函数图的绘制,但是如何使用matplotlib绘制动态图,以及绘制动态多图,直到今天才学会。
1.参考文字
首先感谢几篇文字的作者,帮我学会了如何绘制,大家也可以参考他们的文字。
- http://blog.csdn.net/rumswell/article/details/11731003:文字作者给出了数个示例的源码,但是没有很详细的讲解,源码面前无秘密,自己看吧。
- http://mytrix.me/2013/08/matplotlib-animation-tutorial/:这位作者的讲解很详细,主要讲了matplotlib官方示例,大家可以参阅。
- http://blog.yangyu.me/2014/08/06/matplotlib-graphing-series/:这位作者,给出了不同的示例,而且非常详细,告诉了大家如何一步步学习Matplotlib绘图
- http://sebug.net/paper/books/scipydoc/matplotlib_intro.html#id4:用Python做科学计算,很好很详实的书。
2.程序源码
先贴出程序源码,在一步步做解释。
<span style="font-family:SimSun;font-size:10px;">import numpy as np from matplotlib import pyplot as plt from matplotlib import animation # first set up the figure, the axis, and the plot element we want to animate fig = plt.figure() ax1 = fig.add_subplot(2,1,1,xlim=(0, 2), ylim=(-4, 4)) ax2 = fig.add_subplot(2,1,2,xlim=(0, 2), ylim=(-4, 4)) line, = ax1.plot([], [], lw=2) line2, = ax2.plot([], [], lw=2) def init(): line.set_data([], []) line2.set_data([], []) return line,line2 # animation function. this is called sequentially def animate(i): x = np.linspace(0, 2, 100) y = np.sin(2 * np.pi * (x - 0.01 * i)) line.set_data(x, y) x2 = np.linspace(0, 2, 100) y2 = np.cos(2 * np.pi * (x2 - 0.01 * i))* np.sin(2 * np.pi * (x - 0.01 * i)) line2.set_data(x2, y2) return line,line2 anim1=animation.FuncAnimation(fig, animate, init_func=init, frames=50, interval=10) plt.show() </span>
3.解释
现在就来解释下,这个程序我究竟干了啥
3.1建立子图、空白线
fig = plt.figure() ax1 = fig.add_subplot(2,1,1,xlim=(0, 2), ylim=(-4, 4)) ax2 = fig.add_subplot(2,1,2,xlim=(0, 2), ylim=(-4, 4)) line, = ax1.plot([], [], lw=2) line2, = ax2.plot([], [], lw=2)
在上面的程序可以看到,先建立了一个figure对象,之后fig.add_subplot(2,1,1,xlim=(0, 2), ylim=(-4, 4))就是建立子图,关于子图的概念和做法,大家可以参阅下文字【4】“用Python做科学计算”关于子图的介绍。
3.2创建动画发生时调用的函数
Init()是我们的动画在在创建动画基础框架(base frame)时调用的函数。这里我们们用一个非常简单的对line什么都不做的函数。这个函数一定要返回line对象,这个很重要,因为这样就能告诉动画之后要更新的内容,也就是动作的内容是line。--来自(http://mytrix.me/2013/08/matplotlib-animation-tutorial/)
上面的这段话,解释了Init()这个函数是干嘛的,因为我的程序比较特殊,希望能够在一张图中显示两个子图,如图3.1。所以我必须在两个坐标轴ax1和ax2中创建两个空白的线line,line2且在Init()中返回这两个Line。
图3.1
def init(): line.set_data([], []) line2.set_data([], []) return line,line23.3动画函数
接下来你需要一个动画函数,在这个动画函数中修改你的图,同样的我需要一张图中显示两个东西,所以在动画函数中,我更新了两个图,且返回了line和line2def animate(i): x = np.linspace(0, 2, 100) y = np.sin(2 * np.pi * (x - 0.01 * i)) line.set_data(x, y) x2 = np.linspace(0, 2, 100) y2 = np.cos(2 * np.pi * (x2 - 0.01 * i))* np.sin(2 * np.pi * (x - 0.01 * i)) line2.set_data(x2, y2) return line,line23.4显示动画
最后你需要用如下的两个语句来显示动画,这里有个注意的地方,需要调整interval参数(这个参数指明了时间间隔)的大小,不然会出现如图3.2一样的情况(当你使用了,blit=True这个选项)。同时(http://mytrix.me/2013/08/matplotlib-animation-tutorial/)给我们说明了几个参数的作用,我在不在复述:这个对象需要持续存在,所有我们要将它赋给一个变量,我们选择了一个100帧的动画(译者注:你上边的代码还是200帧,怎么到这儿就变成100帧了……,另外,这里也不一定一定要是个数字,可以是个generator 或iterable,详见API说明)并且帧与帧之间间隔20ms,blit是一个非常重要的关键字,它告诉动画只重绘修改的部分,结合上面保存的时间, blit=true会使动画显示得会非常非常快。
图3.2anim1=animation.FuncAnimation(fig, animate, init_func=init, frames=50, interval=10) plt.show()3.5结束
上面的工作解释完了,来看看成果。程序写的不好,我也是才初学,希望看到博客的人,能多多给我指教,不胜感激。
Python学习-使用matplotlib画动态多图
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。