三流Mayavi操作-Mayav-应用举例

秉着边学边写边折腾的原则,开始粗糙的工作。真正掌握还是得讲解给别人听。
先给出网课
https://www.icourse163.org/course/BIT-1001871001
Mayavi官方
http://docs.enthought.com/mayavi/mayavi/index.html

这里有不少例子的,主要都是一些比较小的例子,如果有必要,就后面再单开比较大的例子。
http://docs.enthought.com/mayavi/mayavi/mlab.html#a-demo
.

本来这个文章就是断断续续的,打算单开这一篇来写一些实用的绘制实例。
如果篇幅长了,就会重开一篇,初步设想就是几个例子一篇。
所以这篇是长期随时更新的,不完结。
绘制一些好玩的图。

1

*扩展的实例。
前段时间刚开始接触机器学习,(菜鸡,你怎么才开始?啊对,就是菜鸡,就是才开始,萌新瑟瑟发抖。)
为了更好地巩固复习(现炒现卖)我决定,尽可能多做图,采用Mayavi,适当的matplotlib这里

这是我想要的效果如下。(这个是网上偷的,我的图下面,我只绘制了1/4
在这里插入图片描述

1.绘制基本外形

1.设置下降起点,我选的(2,3,13),这个无所谓
2.mgrid离散网格,利用 r1 = 0.25*(x1**2+y1**2)获得网格高度r1
3.surf分别绘制渐变的surfacewireframe,并选用热辣的LUT配色方案'hot'(我喜欢),然后细节上微调线径宽度line_width=1.2opacity两种最好不一样,我们需要强调的是网格,至于surface只为了突出它的值是变化的,hot~
4.修饰outline方便观察值域,xlable这个稍微注意添加的位置,这里添加的位置是surf下,surf是全局绘制
5.绘制一个起点points3d
6.设置figurebgcolor,这里是背景色。

start_x,start_y,start_z = 2,3,13   #下降起点
figure(bgcolor=(0.5,0.5,0.5))
x1,y1 = np.mgrid[0:3:15j, 0:3:15j]    #离散不要太大,太密集不好观察
r1 = 0.25*(x1**2+y1**2)
surf(x1,y1,r1,colormap='hot',opacity=0.2)
surf(x1,y1,r1,colormap='hot',line_width=1.2,opacity=0.4,representation='wireframe')
xlabel('x')
outline(color=(1,0,0),opacity=0.8)
x_start,y_start,z_start = np.array([start_x]),np.array([start_y]),np.array([start_z])*0.25
points3d(x_start,y_start,z_start,z_start,colormap="copper",name='StartPoint',scale_factor=.05)   

2.上面的部分绘制了一个下降起点和具有诱惑的网格,现在继续。

1.涉及符号计算sympy,做了必要的命名之后,diff()进行求导,机器学习里面的alp学习速率,再一并设置迭代次数times,这里我只迭代10次。
2.中间的处理我不说了,都是计算
3.从points3d开始绘制每次迭代之后产生的新的点,contour_surf这次的用法唯一特殊在于contours接受的是list,也就是以每个点所在的位置绘制等高线。quiver3d也就是这篇文章的重点了,接受了6个参数,是对位置和三个方向的向量描述。最后,plot3d把沿梯度下降的点连接起来。

theta0,theta1 = symbols('theta0,theta1')
f = theta0**2 + theta1**2
vector0,vector1 = f.diff(theta0),f.diff(theta1)  #偏微
alp = 0.1       #下降速率
times = 10      #迭代次数
kx,ky = vector0.subs(theta0,start_x),vector1.subs(theta1,start_y)
list_x,list_y,list_z = [],[],[] #[start_x],[start_y],[start_z]
vect_x,vect_y,vect_z = [],[],[]
for ti in range(times):
    kx,ky = vector0.subs(theta0,start_x),vector1.subs(theta1,start_y)                   #斜率
    vect_x.append(float(-kx));vect_y.append(float(-ky));vect_z.append(-1)
    start_x -= alp*kx;start_y -= alp*ky;start_z = (start_x ** 2 + start_y ** 2)*0.25    #按方向下降
    list_x.append(float(start_x));list_y.append(float(start_y));list_z.append(float(start_z))
sca = [3 for num in range(times)]      
points3d(list_x,list_y,list_z,sca,colormap='cool',name='GradientPoint',scale_factor=.04)
contour_surf(x1,y1,r1,contours=list_z,name='GradientContour',opacity=1)
quiver3d(list_x,list_y,list_z,vect_x,vect_y,vect_z,scale_factor=.1)
plot3d(list_x,list_y,list_z,sca,name='Connection',tube_radius=None,line_width=4.2)
show()

在这里插入图片描述

在这里插入图片描述
源码我都贴出来了。也上传了。

2.f(x,y)=(1−x)^2+100(y−x^2)^2

这图不是我画的,是别人家的图
https://blog.csdn.net/pengjian444/article/details/71075544?utm_source=blogxgwz0&tdsourcetag=s_pcqq_aiomsg
在这里插入图片描述
.
.
.这个图的代码绘制是非常好写的,这个图原图是采用的matplotlib,先赞,做出来的图漂亮得没话说,印刷级的。
我们在Mayavi中重现它。
代码原型很简单,如下:

import numpy as np
from mayavi import mlab
x,y = np.mgrid[-3:3:40j,-1.5:3:40j]
z = (1-x)**2 + 100*(y-x**2)**2
mlab.surf()
mlab.show()

以上完成基本图形。
但是注意了,mayavi中会按照原始比例作图,z的值几k,x,y是小数点级别的变化,你会得到一个长条。所以要进行修改。
为了突出网格,

import numpy as np
from mayavi import mlab
#f(x,y)=(1−x)2+100(y−x2)2
x,y = np.mgrid[-2:2:60j,-1.5:3:60j]
z = (1-x)**2 + 100*(y-x**2)**2
z_max = np.max(z)
x_max = np.max(x)
adj_warp = x_max/z_max
sc = np.zeros_like(z)+1

# adj_warp = 0.0005
mlab.surf(x,y,z,vmax=130,vmin=0,representation='wireframe',name='Grid',warp_scale=adj_warp)
mlab.surf(x,y,z,vmax=130,vmin=0,opacity=0.4,warp_scale=adj_warp)
mlab.outline(color=(1,0,0))
mlab.show()

在这里插入图片描述
.

中间我将继续追加梯度下降的绘制会在最后一步show()之前插入,然后会对这个图形继续进行修饰。
未更新完、

更新
2018.10.23. ——将原来写在2.1.0.5.points3d,.quiver3d下的一个举例插过来、补充f(x,y)=(1−x)^2+100(y−x^2)^2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值