「草稿」使用 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卡)
给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
–未完待续–