秉着边学边写边折腾的原则,开始粗糙的工作。真正掌握还是得讲解给别人听。 先给出网课
https://www.icourse163.org/course/BIT-1001871001
Mayavi官方
http://docs.enthought.com/mayavi/mayavi/genindex.html
(有时候这网站会装死,一般过几个小时就会活过来)
我发现了,光是三流操作还不够,还得加上四流翻译。

我把目录从这里剔除出去了,否则每次改很麻烦。
这周因为要做一个图示,所以就先把quiver提上来说一下
points3d,quiver3d
单从这两个函数名大概对这两个是比较清楚的,分别绘制的是点和向量。
这两个放在一起也是因为他们的相似参数很多,因为它们都是对点的描述。

1.quiver3d

老规矩从官方例子开始,先微调一下官方代码

import numpy as np
from mayavi.mlab import *
x, y, z = np.mgrid[-2:3, -2:3, -2:3]
r = np.sqrt(x ** 2 + y ** 2 + z ** 4)
u = y * np.sin(r) / (r + 0.001)
v = -x * np.sin(r) / (r + 0.001)
w = np.zeros_like(z)
obj = quiver3d(x, y, z, u, v, w, line_width=3, scale_factor=1)
outline(color=(1,0,0),opacity=0.8)
show()

三流Mayavi操作-Mayav-2.1.0.5-points3d,quiver3d绘制

文档中对这个函数的描述如下:
Plots glyphs (like arrows) indicating the direction of the vectors at the positions supplied.
在所给位置放置图形(比如箭头)来表示该处向量的方向。

语法如下:
quiver3d(u, v, w, ...)
quiver3d(x, y, z, u, v, w, ...)
quiver3d(x, y, z, f, ...)

2.points3d

extent

3.参数

.
.
.
.
.
.
.
.
.

.
.
.
.

未更新。

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

这是我想要的效果如下。(这个是网上偷的,我的图下面,我只绘制了1/4
三流Mayavi操作-Mayav-2.1.0.5-points3d,quiver3d绘制

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()

三流Mayavi操作-Mayav-2.1.0.5-points3d,quiver3d绘制

三流Mayavi操作-Mayav-2.1.0.5-points3d,quiver3d绘制

.
.
.

源码我都贴出来了。也上传了。

填坑区:

更新
2018.10.20.——因为机器学习的缘故要绘制一个图像,顺带把quiver3d写一点

相关文章:

  • 2021-12-22
  • 2021-12-28
  • 2021-04-08
  • 2022-12-23
  • 2022-12-23
  • 2021-09-06
  • 2022-01-17
  • 2021-11-10
猜你喜欢
  • 2022-01-11
  • 2021-10-01
  • 2021-09-22
  • 2021-08-07
  • 2021-08-05
  • 2021-12-18
  • 2022-12-23
相关资源
相似解决方案