使用matplotlib绘制4D拟合曲面

时间:2015-08-04 04:15:14

标签: python matplotlib curve-fitting

我正在使用数据结构类似于:

x = [1.6,1.9,2.6,2.8,3.1,3.6,1.4,2.7]
y = [98.2,165.2,174.3,109.5,132.5,162.4,95.3,98.5]
z = [100.2,121.5,173.5,89.9,154.7,127.4,147.2,155.9]
m = [-0.2,-1.4,0.3,3.1,-4.2,-2.6,1.7,-1.9] 

此处,x,y,z均可独立变量,可以表示为m=f(x,y,z)
我正在尝试实现4D曲面图(适用于生成方程的多项式),m表示3D曲面的颜色渐变。
虽然提供了一个非常好的示例(代表z=f(x,y)):https://stackoverflow.com/a/18648210/97160

但是我无法在4D中使用matplotlib执行此类操作,其中m=f(x.y,z)

对此问题的一些帮助或建议将受到高度赞赏。

1 个答案:

答案 0 :(得分:2)

您提出了两个不同的问题:

  1. 如何拟合数据;和
  2. 如何可视化从拟合过程中获得的功能。
  3. 对于第一部分,您可以使用curve-fit中的minimizescipy等内置函数进行拟合。

    例如

    import numpy as np
    from scipy.optimize import minimize
    
    x = np.array([1.6, 1.9, 2.6, 2.8, 3.1, 3.6, 1.4, 2.7])
    y = np.array([98.2, 165.2, 174.3, 109.5, 132.5, 162.4, 95.3, 98.5])
    z = np.array([100.2, 121.5, 173.5, 89.9, 154.7, 127.4, 147.2, 155.9])
    m = np.array([-0.2, -1.4, 0.3, 3.1, -4.2, -2.6, 1.7, -1.9])
    
    def func(coef, x, y, z, m):
        a = coef[0]
        b = coef[1]
        c = coef[2]
        return np.linalg.norm(m - a*x**2 + b*y**2 + c*z**2)
    
    res = minimize(func, [1, 1, 1], args=(x, y, z, m))
    a, b, c = res.x
    

    您需要定义所需的模型并使其适合。

    对于第二部分,您正在寻找3D域上的标量可视化,我认为matplotlib不是最佳选择。我会改用Mayavi

    以下示例

    import numpy as np
    from mayavi import mlab
    
    x, y, z = np.mgrid[-5:5:65j, -5:5:65j, -5:5:65j]
    scalars = x * x * 0.5 + y * y + z * z * 2.0
    
    cont = np.linspace(np.min(scalars), np.max(scalars), 8)
    mlab.contour3d(x, y, z, scalars, contours=list(cont), colormap='YlGnBu')
    mlab.show()
    

    这给出了一些关于域的轮廓。您也可以尝试使用体积渲染技术。

    enter image description here