最近常常使用matplotlib进行数学函数图的绘制,可是怎样使用matplotlib绘制动态图,以及绘制动态多图。直到今天才学会。

1.參考文字

首先感谢几篇文字的作者。帮我学会了怎样绘制。大家也能够參考他们的文字。

  1. http://blog.csdn.net/rumswell/article/details/11731003:文字作者给出了数个演示样例的源代码。可是没有非常具体的解说。源代码面前无秘密。自己看吧。

  2. http://mytrix.me/2013/08/matplotlib-animation-tutorial/:这位作者的解说非常具体,主要讲了matplotlib官方演示样例。大家能够參阅。

  3. http://blog.yangyu.me/2014/08/06/matplotlib-graphing-series/:这位作者,给出了不同的演示样例,并且非常具体,告诉了大家怎样一步步学习Matplotlib画图
  4. 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)时调用的函数。这里我们们用一个非常easy的对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,line2

3.3动画函数

接下来你须要一个动画函数。在这个动画函数中改动你的图。相同的我须要一张图中显示两个东西,所以在动画函数中,我更新了两个图,且返回了line和line2
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

3.4显示动画

最后你须要用例如以下的两个语句来显示动画,这里有个注意的地方。须要调整interval參数(这个參数指明了时间间隔)的大小,不然会出现如图3.2一样的情况(当你使用了,blit=True这个选项)。
同一时候(http://mytrix.me/2013/08/matplotlib-animation-tutorial/)给我们说明了几个參数的作用,我在不在复述:

这个对象须要持续存在,全部我们要将它赋给一个变量。我们选择了一个100帧的动画(译者注:你上边的代码还是200帧,怎么到这儿就变成100帧了……。另外。这里也不一定一定要是个数字,能够是个generator 或iterable,详见API说明)而且帧与帧之间间隔20ms,blit是一个很重要的keyword。它告诉动画仅仅重绘改动的部分。结合上面保存的时间,
blit=true会使动画显示得会很很快。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYnVzaDI1ODI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">

图3.2
anim1=animation.FuncAnimation(fig, animate, init_func=init,  frames=50, interval=10)
plt.show()

3.5结束

上面的工作解释完了,来看看成果。程序写的不好。我也是才初学。希望看到博客的人。能多多给我不吝赐教,不胜感激。

Python学习-使用matplotlib画动态多图的更多相关文章

  1. Matplotlib学习---用matplotlib画箱线图(boxplot)

    箱线图通过数据的四分位数来展示数据的分布情况.例如:数据的中心位置,数据间的离散程度,是否有异常值等. 把数据从小到大进行排列并等分成四份,第一分位数(Q1),第二分位数(Q2)和第三分位数(Q3)分 ...

  2. Matplotlib学习---用matplotlib画直方图/密度图(histogram, density plot)

    直方图用于展示数据的分布情况,x轴是一个连续变量,y轴是该变量的频次. 下面利用Nathan Yau所著的<鲜活的数据:数据可视化指南>一书中的数据,学习画图. 数据地址:http://d ...

  3. matplotlib 画动态图以及plt.ion()和plt.ioff()的使用

    学习python的道路是漫长的,今天又遇到一个问题,所以想写下来自己的理解方便以后查看. 在使用matplotlib的过程中,常常会需要画很多图,但是好像并不能同时展示许多图.这是因为python可视 ...

  4. Matplotlib学习---用matplotlib画阶梯图(step plot)

    这里利用Nathan Yau所著的<鲜活的数据:数据可视化指南>一书中的数据,学习画图. 数据地址:http://datasets.flowingdata.com/us-postage.c ...

  5. Matplotlib学习---用matplotlib画面积图(area chart)

    这里利用Nathan Yau所著的<鲜活的数据:数据可视化指南>一书中的数据,学习画图. 数据地址:http://book.flowingdata.com/ch05/data/us-pop ...

  6. Matplotlib学习---用matplotlib画热图(heatmap)

    这里利用Nathan Yau所著的<鲜活的数据:数据可视化指南>一书中的数据,学习画图. 数据地址:http://datasets.flowingdata.com/ppg2008.csv ...

  7. Matplotlib学习---用matplotlib画雷达图(radar chart)

    雷达图常用于对多项指标的全面分析.例如:HR想要比较两个应聘者的综合素质,用雷达图分别画出来,就可以进行直观的比较. 用Matplotlib画雷达图需要使用极坐标体系,可点击此链接,查看对极坐标体系的 ...

  8. [python学习手册-笔记]004.动态类型

    004.动态类型 ❝ 本系列文章是我个人学习<python学习手册(第五版)>的学习笔记,其中大部分内容为该书的总结和个人理解,小部分内容为相关知识点的扩展. 非商业用途转载请注明作者和出 ...

  9. Matplotlib学习---用matplotlib画折线图(line chart)

    这里利用Jake Vanderplas所著的<Python数据科学手册>一书中的数据,学习画图. 数据地址:https://raw.githubusercontent.com/jakevd ...

随机推荐

  1. hdoj 1874 畅通工程续(单源最短路+dijkstra)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 思路分析:该问题给定一个无向图.起始点和终点,要求求出从起始点到终点的最短距离: 使用Dijks ...

  2. poj 2593 Max Sequence(线性dp)

    题目链接:http://poj.org/problem?id=2593 思路分析:该问题为求给定由N个整数组成的序列,要求确定序列A的2个不相交子段,使这m个子段的最大连续子段和的和最大. 该问题与p ...

  3. js 获取前天、昨天、今天、明天、后天的时间

    js 获取前天.昨天.今天.明天.后天的时间 2011-05-19 21:03   <html><head><meta http-equiv="Content- ...

  4. [置顶] js操作iframe兼容各种浏览器

    在做项目时,遇到了操作iframe的相关问题.业务很简单,其实就是在操作iframe内部某个窗体时,调用父窗体的一个函数.于是就写了两个很简单的htm页面用来测试,使用网上流行的方法在谷歌浏览器中始终 ...

  5. Android的重力传感器(3轴加速度传感器)简单实例

    重力感应主要是依靠手机的加速度传感器(accelerometer)来实现 在Android的开发中一共有八种传感器但是不一定每一款真机都支持这些传感器.因为很多功能用户根本不care的所以可能开发商会 ...

  6. SQL 插入语句汇总

    INSERT VALUES 插入一行或多行到目标表中 -- single row INSERT INTO Sales.MyOrders(custid, empid, orderdate, shipco ...

  7. eclipse修改java代码后报错: java.lang.OutOfMemoryError: PermGen space

    由于在eclipse中运行项目后,我们又重新修改了某个java类,导致tomcat会重新加载这个项目所有的class.jar,多次加载后由于分配的存储空间有限,就导致了:java.lang.OutOf ...

  8. CSS: inline-block的应用和float块高度塌陷

    普通流高度塌陷: 当块float浮动时,不会对块布局产生影响,块仍然会按照左右或者上下的顺序排列.但是会影响文档的排列,当文档的高度超过块的高度时,块的高度会产生塌陷现象.   高度塌陷解决方法:   ...

  9. r语言之生成随机序列,随机数生成函数及用法

    (1)生成正态分布随机数: rnorm(n,mean,sd)     其中,n表示生成的随机数个数,mean表示正态分布均值,sd表示正态分布标准差 > rnorm(5,0,2)[1] -5.3 ...

  10. 高级UNIX环境编程13 守护进程

    linux下,keventd守护进程为内核中运行的执行的函数提供进程上下文 bdflush,kupdated将高速缓存中的数据冲洗到磁盘上