经过持续实例,来感觉mlab对数据可视化的方便性
import numpy as np from mayavi import mlab x,y,z = np.ogrid[-10:10:20j,-10:10:20j,-10:10:20j] s = np.sin(x*y*z)/(x*y*z) mlab.contour3d(s) #等值面绘制 mlab.show()
import numpy as np from mayavi import mlab x,y,z = np.ogrid[-10:10:20j,-10:10:20j,-10:10:20j] s = np.sin(x*y*z)/(x*y*z) #绘制两个方向的切平面 mlab.pipeline.image_plane_widget(mlab.pipeline.scalar_field(s), #scalar_field得到数据的标量数据场 plane_orientation="x_axes", #设置切平面的方向 slice_index=10 ) mlab.pipeline.image_plane_widget(mlab.pipeline.scalar_field(s), plane_orientation="y_axes", slice_index=10 ) #为这个数据绘制外框 mlab.outline() mlab.show()
import numpy as np from mayavi import mlab x,y,z = np.ogrid[-10:10:20j,-10:10:20j,-10:10:20j] s = np.sin(x*y*z)/(x*y*z) src = mlab.pipeline.scalar_field(s) #创建标量场数据 mlab.pipeline.iso_surface(src,contours=[s.min()+0.1*s.ptp(),],opacity=0.1) #iso_surface对输入体绘制其等值面,记得设置透明度,不然内部数据将被外部遮挡 mlab.pipeline.iso_surface(src,contours=[s.max()-0.1*s.ptp(),]) #也可使用等值面iso_surface,来观察必定范围内的数据 #绘制切平面 mlab.pipeline.image_plane_widget(src, #使用切平面来观察某一平面的数据细节 plane_orientation="z_axes", #设置切平面的方向 slice_index=10 ) mlab.show()
import numpy as np from mayavi import mlab x,y,z = np.mgrid[0:1:20j,0:1:20j,0:1:20j] #u,v,w是在点x,y,z处的矢量数据 u = np.sin(np.pi*x)*np.cos(np.pi*z) v = -2*np.sin(np.pi*x)*np.cos(2*np.pi*z) w = np.cos(np.pi*x)*np.sin(np.pi*z) + np.cos(np.pi*y)*np.sin(2*np.pi*z) mlab.quiver3d(u,v,w) #quiver3d能够在数据点处画出箭头 mlab.outline() mlab.show()
上面数据过于密集:可使用降采样:科学计算三维可视化---TVTK库可视化实例
import numpy as np from mayavi import mlab x,y,z = np.mgrid[0:1:20j,0:1:20j,0:1:20j] #u,v,w是在点x,y,z处的矢量数据 u = np.sin(np.pi*x)*np.cos(np.pi*z) v = -2*np.sin(np.pi*x)*np.cos(2*np.pi*z) w = np.cos(np.pi*x)*np.sin(np.pi*z) + np.cos(np.pi*y)*np.sin(2*np.pi*z) src = mlab.pipeline.vector_field(u,v,w) #pipeline的vectors构建了矢量域 mlab.pipeline.vectors(src,mask_points=10,scale_factor=2.0) #mask_points没10个数据点选取一个,scale_factor放缩比率2.0 mlab.show()
import numpy as np from mayavi import mlab x,y,z = np.mgrid[0:1:20j,0:1:20j,0:1:20j] #u,v,w是在点x,y,z处的矢量数据 u = np.sin(np.pi*x)*np.cos(np.pi*z) v = -2*np.sin(np.pi*x)*np.cos(2*np.pi*z) w = np.cos(np.pi*x)*np.sin(np.pi*z) + np.cos(np.pi*y)*np.sin(2*np.pi*z) src = mlab.pipeline.vector_field(u,v,w) #pipeline的vectors构建了矢量域 mlab.pipeline.vector_cut_plane(src,mask_points=10,scale_factor=2.0) #mask_points没10个数据点选取一个,scale_factor放缩比率2.0 mlab.show()
级数是矢量域中的重要参数,他能够显示数量的法线等值面,咱们经过计算矢量法向获得一个标量域
import numpy as np from mayavi import mlab x,y,z = np.mgrid[0:1:20j,0:1:20j,0:1:20j] #u,v,w是在点x,y,z处的矢量数据 u = np.sin(np.pi*x)*np.cos(np.pi*z) v = -2*np.sin(np.pi*x)*np.cos(2*np.pi*z) w = np.cos(np.pi*x)*np.sin(np.pi*z) + np.cos(np.pi*y)*np.sin(2*np.pi*z) src = mlab.pipeline.vector_field(u,v,w) magnitude = mlab.pipeline.extract_vector_norm(src) #extract_vector_norm经过计算矢量法向获得一个标量域 mlab.pipeline.iso_surface(magnitude,contours=[2.0,0.5]) #构建等值面 mlab.outline() mlab.show()
import numpy as np from mayavi import mlab x,y,z = np.mgrid[0:1:20j,0:1:20j,0:1:20j] #u,v,w是在点x,y,z处的矢量数据 u = np.sin(np.pi*x)*np.cos(np.pi*z) v = -2*np.sin(np.pi*x)*np.cos(2*np.pi*z) w = np.cos(np.pi*x)*np.sin(np.pi*z) + np.cos(np.pi*y)*np.sin(2*np.pi*z) flow = mlab.flow(u,v,w,seed_scale=1, seed_resolution=5, integration_direction="both") mlab.outline() mlab.show()
为矢量场数据给出有意义的矢量观测是比较有困难的工做,所以一般咱们须要使用不一样的根据,对矢量数据进行可视化
#等值面 iso = mlab.pipeline.iso_surface(magnitude,contours=[2.0,],opacity=0.3) #构建等值面 #矢量场 vec = mlab.pipeline.vectors(magnitude,mask_points=40,line_width=1, color=(0.8,0.8,0.8), scale_factor=4.) #矢量场流线 flow = mlab.pipeline.streamline(magnitude,seedtype="plane", seed_visible=False, seed_scale=0.5, seed_resolution=1, linetype="ribbon") #矢量场切平面 vcp = mlab.pipeline.vector_cut_plane(magnitude,mask_points=2, scale_factor=4, colormap="jet", plane_orientation="x_axes")