• 科学计算三维可视化---Mlab基础(基于Numpy数组的绘图函数)


    Mlab了解

    Mlab是Mayavi提供的面向脚本的api,他可以实现快速的三维可视化,Mayavi可以通过Mlab的绘图函数对Numpy数组建立可视化。

    过程为:

    1.建立数据源
    
    2.使用Filter(可选)对数据进行加工
    
    3.添加可视化模块,我们可以通过修改可视化模块的属性,来修改可视化场景

    mgrid和ogrid区别

    一:基于Numpy数组的绘图函数

    (一)3D绘图函数--Point3d(点图像0维

    这里我们可以看到Point3D参数的描述,是对vtk对象的整体描述,因为Mayavi是对VTK的整体封装,因此Mayavi建立的对象也就是VTK的对象
    import numpy as np
    from mayavi import mlab
    
    #建立数据
    t = np.linspace(0,4*np.pi,20)   #linspace根据起止数据等间距填充数据,分为20组,所以下面将产生20个点
    x = np.sin(2*t)
    y = np.cos(t)
    z = np.cos(2*t)
    s = 2 + np.sin(t)
    
    #对数据进行可视化
    points = mlab.points3d(x,y,z,s,colormap="Reds",scale_factor=.25)
    mlab.show()
    mlab.points3d(x,y,z,s,colormap="Reds",scale_factor=.25) #x,y,z表示Numpy数组,列表或者其他形式的点三维坐标,s表示在该点处的标量值,scale_factor放缩比例

    这里:标量值越大,点的尺寸越大,颜色越红
    points = mlab.points3d(x,y,z,s,colormap="Greens",scale_factor=.25)

    Mayavi.mlab.show建立了简单的GUI,并开始了事件循环,stop用来定义GUI的事件循环是否结束

    (二)3D绘图函数--plot3d(线图形一维

    import numpy as np
    from mayavi import mlab  #引入mlab库
    
    #建立数据
    n_mer,n_long = 6,11
    dphi = np.pi / 1000.0
    phi = np.arange(0.0,2*np.pi+0.5*dphi,dphi)
    mu = phi * n_mer
    x = np.cos(mu)*(1+np.cos(n_long*mu/n_mer)*0.5)
    y = np.sin(mu)*(1+np.cos(n_long*mu/n_mer)*0.5)
    z = np.sin(n_long*mu/n_mer)*0.5
    
    #对数据进行可视化
    l = mlab.plot3d(x,y,z,np.sin(mu),tube_radius=0.025,colormap="Spectral")
    mlab.show()

    (三)3D绘图函数--2D数据(二维

    (1)imshow方法

    import numpy as np
    from mayavi import mlab
    
    #建立数据
    s = np.random.random((10,10))   #二维数据
    
    #对数据进行可视化
    img = mlab.imshow(s,colormap="gist_earth")  #gist_earth以地球表面的色彩为颜色的颜色映射关系
    mlab.show()

    (2)surf方法

    s:二维数组第一列表示x轴位置,第二列表示y轴位置,x,y可以是一维或者二维数组,一般情况下,他们都由numpy的mgrid或ogrid得到
    import numpy as np
    from mayavi import mlab
    
    def f(x,y):
        return np.sin(x-y)+np.cos(x+y)
    
    x,y = np.mgrid[-7.:7.05:0.1,-5.:5.05:0.05]
    s = mlab.surf(x,y,f)
    mlab.show()
    mgrid返回两个二维数组(个数是不固定的,我们放置几个元素,就会生成几个二维数组)
    -7.:7.05:0.1---->最小-7,最大7.05,步长为0.1依次生成一个n*n矩阵
    >>> x,y = np.mgrid[-7.:7.05:0.1,-5.:5.05:0.05]
    >>> x
    array([[-7. , -7. , -7. , ..., -7. , -7. , -7. ],
           [-6.9, -6.9, -6.9, ..., -6.9, -6.9, -6.9],
           [-6.8, -6.8, -6.8, ..., -6.8, -6.8, -6.8],
           ...,
           [ 6.8,  6.8,  6.8, ...,  6.8,  6.8,  6.8],
           [ 6.9,  6.9,  6.9, ...,  6.9,  6.9,  6.9],
           [ 7. ,  7. ,  7. , ...,  7. ,  7. ,  7. ]])
    >>> y
    array([[-5.  , -4.95, -4.9 , ...,  4.9 ,  4.95,  5.  ],
           [-5.  , -4.95, -4.9 , ...,  4.9 ,  4.95,  5.  ],
           [-5.  , -4.95, -4.9 , ...,  4.9 ,  4.95,  5.  ],
           ...,
           [-5.  , -4.95, -4.9 , ...,  4.9 ,  4.95,  5.  ],
           [-5.  , -4.95, -4.9 , ...,  4.9 ,  4.95,  5.  ],
           [-5.  , -4.95, -4.9 , ...,  4.9 ,  4.95,  5.  ]])

    (3)contour_surf() 与surf()类似,单求解的是等值线,surf求解的是曲面

    import numpy as np
    from mayavi import mlab
    
    def f(x,y):
        return np.sin(x-y)+np.cos(x+y)
    
    x,y = np.mgrid[-7.:7.05:0.1,-5.:5.05:0.05]
    s = mlab.contour_surf(x,y,f)
    mlab.show()

    (四)3D绘图函数--3D数据(三维)

    (1)contour3d方法

    import numpy as np
    from mayavi import mlab
    
    x,y,z = np.ogrid[-5:5:64j,-5:5:64j,-5:5:64j]  #64j表示数组长度为64
    scalars = x*x + y*y +z*z
    obj = mlab.contour3d(scalars,contours=8,transparent=True)  #contours八个等值面  transparent该对象可以透明表示,可以查看内部
    mlab.show()
    ogrid返回3个三维数组(几个是不固定的,我们设置了几个元素,就生成相对应个三维数组)
    >>> x,y,z = np.ogrid[-5:5:64j,-5:5:64j,-5:5:64j]
    >>> x
    array([[[-5.        ]],  #共64个元素
    
           [[-4.84126984]],
    
           [[-4.68253968]],
    
          .......
    [[ 4.68253968]], [[ 4.84126984]], [[ 5. ]]])

    (2)quiver3d()方法

    (x,y,z表示箭头位置,二维即可,不需要三维表示)

    import numpy as np
    from mayavi import mlab

    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 = mlab.quiver3d(x,y,z,u,v,w,line_width=3,scale_factor=1)
    mlab.show()

  • 相关阅读:
    PHP使用http_build_query()构造URL字符串的方法
    php将一个二维数组按照某个字段值合并成一维数组,如果有重复则将重复的合并成二维数组
    资金管理
    偏爱粉色,我的儿子会不会娘娘腔?
    中文期刊有哪些?
    超声胎儿图像分割
    加州wonders教材扫盲
    美国小学1-5年级教学大纲
    A股回归牛市?
    深入研究股票涨停
  • 原文地址:https://www.cnblogs.com/ssyfj/p/9303698.html
Copyright © 2020-2023  润新知