「草稿」使用 mplot3d 绘制动态 3D 图

最近记性特别差,做的东西如果不记下来,过几天就忘光了。照这样发展下去马上就老年痴呆了,趁年轻还是多学点东西

最近正在学习一些大数据、机器学习的一些算法,脑子一热准备把遗传算法/模拟退火算法这些经典的算法用动图模拟出来。在《白话大数据与机器学习》中有实现遗传算法的代码,本文基于教程上的代码进行修改,实现模拟遗传算法求极值的过程。

题目是要通过遗传算法求解z=y sin(x) + x cos(y)在 [-10,10]内的极大值。想法是这样的,先绘制函数曲线,然后通过遗传算法进行计算,把每一步的计算结果依次显示在图像的坐标上,形成动画。(做了一半,感觉动图好像并不能形象的描绘出遗传算法)

Python

有了NumPy,基本可以放弃Matlab/Octave了。将Python相当于变成一种免费的更强大的MatLab系统。

“NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。多为很多大型金融公司使用,以及核心的科学计算组织如:Lawrence Livermore,NASA用其处理一些本来使用C++,Fortran或Matlab等所做的任务。”

《用Python做科学计算》是一本超级好的教材,包含了不仅仅以下内容:

  • NumPy-快速处理数据
  • SciPy-数值计算库
  • SymPy-符号运算
  • matplotlib-绘制图表
  • Traits-为Python添加类型定义
  • TraitsUI-制作用户界面
  • Chaco-交互式图表
  • TVTK-三维可视化数据
  • Visual-制作3D演示动画
  • Mayavi-更方便的可视化

matplotlib

刚开始用了mayavi库,画出来的图像很漂亮,不过apt源下载的是4.4.3版本(pip是4.4.4),总提示版本不对要我重新编译,最后折腾折腾就崩溃了。不用mayavi的另一个原因是,我不会把画的图统一到一个参考系里面,画的图忽大忽小的。最后选择了用matplotlib来重写。(改写的时候碰到一个坑:mayavi 用 np.ogrid 生成的X,Y向量;而matplotlib需要用 np.mgrid 生成X,Y矩阵。没有深究)

使用matplotlib绘制3D图很简单,按照 [ 教程1教程2教程3文档1 ] 很快就可以画出像样的图(如下图),并且可以修改颜色和样式。(感觉比mayavi丑一点,并且移动视角的时候比mayavi卡)

z=y sin(x)+x cos(y)

给matplotlib制作动画

对于我这种小白,matplotlib 也是个大坑。用plt.show()画完图以后,程序就卡那不动了,并不能通过计算一步步的显示动画。然后发现了pyplot.ion()这个方法,可以在类似ipython的交互式shell中显示图表 [ 教程1 ] ,并且不会发生阻塞;可是采用非shell的方式并不能够显示图表>_<

这个问题纠结了好久,直到遇见这篇讲解matplotlib画动态多图的教程,然后找到了官方的3D 动态图 example 和这个看起来很牛逼的 example ,还有这个《MATPLOTLIB动画指南》得知,我们需要调用animation API

class matplotlib.animation.FuncAnimation(fig, func, frames=None, init_func=None, fargs=None, save_count=None, **kwargs)

* func: 绘图函数。动画开始以后,会不断的重复调用这个函数来进行绘制。
* frames: 一共有多少帧。
* frags: 传递给func的参数
* blit: 什么鬼?
* interval: 绘制每一帧的时间(ms)
* repeat: 绘制完所有的frames后是否重绘,如果frames=None,那么即使repeat=True,也不会重绘。
* repeat_delay: 重绘之前延时多少ms

–未完待续–