1. 程式人生 > >三流Mayavi操作-Mayav-2.1.0.5-points3d,quiver3d繪製

三流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分別繪製漸變的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()

在這裡插入圖片描述

在這裡插入圖片描述

. . .

原始碼我都貼出來了。也上傳了。