我正在使用数据结构类似于:
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)
。
对此问题的一些帮助或建议将受到高度赞赏。
答案 0 :(得分:2)
您提出了两个不同的问题:
对于第一部分,您可以使用curve-fit
中的minimize
或scipy
等内置函数进行拟合。
例如
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()
这给出了一些关于域的轮廓。您也可以尝试使用体积渲染技术。