Python学习-使用matplotlib画动态多图

近期经常使用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)时调用的函数。这里我们们用一个非常简单的对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是一个非常重要的关键字,它告诉动画只重绘修改的部分,结合上面保存的时间,
blit=true会使动画显示得会非常非常快。

图3.2

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

3.5结束

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

时间: 2024-10-06 21:01:31

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

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

直方图用于展示数据的分布情况,x轴是一个连续变量,y轴是该变量的频次. 下面利用Nathan Yau所著的<鲜活的数据:数据可视化指南>一书中的数据,学习画图. 数据地址:http://datasets.flowingdata.com/crimeRatesByState2005.csv 以下是这个数据文件的前5行: state murder forcible_rape robbery aggravated_assault 0 United States 5.6 31.7 140.7 291.1

Excel2010画动态甘特图

哈哈!你居然真的看简介点进来啦,我也想八一八Henry gantt本人的故事,可是我查了好些资料,一个槽点都没有发现,不过人生经历还是可以了解下: 此人活了58年,生前是一个中规中距的机械工程师&项目管理(PM),活在资本主义螺丝钉,发表过几篇不痛不痒关于项目管理方面的论文和书,可是(人生大转折哇) 在55岁那一年,积累了那么多年的经验,终于顿悟,发明了gantt图,并于同一年发表了 Industrial leadership, 再之后,夜以继日(脑补剧情)地工作,终于在58岁那年又发表了一篇p

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

这里利用Nathan Yau所著的<鲜活的数据:数据可视化指南>一书中的数据,学习画图. 数据地址:http://book.flowingdata.com/ch05/data/us-population-by-age.xls 准备工作:先导入matplotlib和pandas,用pandas读取excel文件,然后创建一个图像和一个坐标轴 import pandas as pd from matplotlib import pyplot as plt population=pd.read_ex

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

雷达图常用于对多项指标的全面分析.例如:HR想要比较两个应聘者的综合素质,用雷达图分别画出来,就可以进行直观的比较. 用Matplotlib画雷达图需要使用极坐标体系,可点击此链接,查看对极坐标体系的介绍:https://www.cnblogs.com/kallan/p/6738577.html. 下面,我们从五个方面(编程能力,沟通技能,专业知识,团队协作,工具掌握)来对路人甲和路人乙进行比较. 代码如下: import numpy as np from matplotlib import p

Python中使用matplotlib 如何绘制折线图?

本文和大家分享的主要是python开发中matplotlib 绘制折线图相关内容,一起来看看吧,希望对大家学习和使用这部分内容有所帮助. matplotlib 1.安装matplotlib ① linux系统安装 # 安装matplotlib模块 $ sudo apt-get install python3-matplotlib# 如果是python2.7 执行如下命令 $ sudo apt-get install python-matplotlib# 如果你安装较新的Python,安装模块一乐

画动态热图

动态图可以更加清晰的反映某种特征的变化趋势,从而给人直观的感受,帮助人们理解抽象化的特征或者不易直接观察到的特征变化趋势. import numpy as np from matplotlib import pyplot as plt from matplotlib import animation imgData = np.random.random((4368,3,16,16)) fig = plt.figure() data = np.random.random((16, 16)) im

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

这里利用Jake Vanderplas所著的<Python数据科学手册>一书中的数据,学习画图. 数据地址:https://raw.githubusercontent.com/jakevdp/data-CDCbirths/master/births.csv 准备工作:先导入matplotlib和pandas,用pandas读取csv文件,然后创建一个图像和一个坐标轴 import pandas as pd from matplotlib import pyplot as plt birth=p

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

这里利用Nathan Yau所著的<鲜活的数据:数据可视化指南>一书中的数据,学习画图. 数据地址:http://datasets.flowingdata.com/ppg2008.csv 首先查看一下数据文件的前5行: Name G MIN PTS FGM FGA FGP FTM FTA FTP ... 0 Dwyane Wade 79 38.6 30.2 10.8 22.0 0.491 7.5 9.8 0.765 ... 1 LeBron James 81 37.7 28.4 9.7 19.

【Python环境】matplotlib - 2D 与 3D 图的绘制

2015-10-30数据科学自媒体 类MATLAB API 最简单的入门是从类 MATLAB API 开始,它被设计成兼容 MATLAB 绘图函数. 让我们加载它: from pylab import * 使用 qt 作为图形后端: %matplotlib qt 示例 类MATLAB API 绘图的简单例子: from numpy import * x = linspace(0, 5, 10) y = x ** 2figure() plot(x, y, 'r') xlabel('x') ylab