三流Mayavi操作-Mayav-2.1.0.5-points3d,quiver3d繪製
我把目錄從這裡剔除出去了,否則每次改很麻煩。
這周因為要做一個圖示,所以就先把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()
文件中對這個函式的描述如下: 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)
1.繪製基本外形
1.設定下降起點,我選的(2,3,13),這個無所謂 2.
mgrid
離散網格,利用r1 = 0.25*(x1**2+y1**2)
獲得網格高度r1
3.surf
分別繪製漸變的surface
和wireframe
,並選用熱辣的LUT配色方案'hot'
(我喜歡),然後細節上微調線徑寬度line_width=1.2
和opacity
兩種最好不一樣,我們需要強調的是網格,至於surface
只為了突出它的值是變化的,hot~ 4.修飾outline
方便觀察值域,xlable
這個稍微注意新增的位置,這裡新增的位置是surf
下,surf
是全域性繪製 5.繪製一個起點points3d
6.設定figure
的bgcolor
,這裡是背景色。
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()
. . .
原始碼我都貼出來了。也上傳了。