我正在尝试使用python 3.4.3和Matplotlib获取在3D散点图中绘制为最佳拟合线的平面的方向。我目前将数据绘制在3D图表中,平面穿过这些点并需要一种方法来获得平面的方向。 看着它从Z轴倾斜的角度。有没有我错过的捷径只是“打印”方向角。或者是否可以从盒子的顶部到平面创建一个三角函数以获得角度。我对mathplotlib知之甚少,因此非常感谢任何帮助。
def plane(x, y, params):
a = params[0]
b = params[1]
c = params[2]
z = a*x + b*y + c
return z
def error(params, points):
result = 0
for (x,y,z) in points:
plane_z = plane(x, y, params)
diff = abs(plane_z - z)
result += diff**2
return result
def cross(a, b):
return [a[1]*b[2] - a[2]*b[1],
a[2]*b[0] - a[0]*b[2],
a[0]*b[1] - a[1]*b[0]]
points = [(1.1,2.1,8.1),
(3.2,4.2,8.0),
(5.3,1.3,8.2),
(3.4,2.4,8.3),
(1.5,4.5,5.0)]
fun = functools.partial(error, points=points)
params0 = [0, 0, 0]
res = scipy.optimize.minimize(fun, params0)
a = res.x[0]
b = res.x[1]
c = res.x[2]
xs, ys, zs = zip(*points)
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.scatter(xs, ys, zs)
point = np.array([0.0, 0.0, c])
normal = np.array(cross([1,0,a], [0,1,b]))
d = -point.dot(normal)
xx, yy = np.meshgrid([-5,10], [-5,10])
z = (-normal[0] * xx - normal[1] * yy - d) * 1. /normal[2]
ax.plot_surface(xx, yy, z, alpha=0.6, color=[1,1,0])
ax.set_xlim(0,10)
ax.set_ylim(0,10)
ax.set_zlim(0,10)
plt.show()
答案 0 :(得分:0)
如果我没记错我的几何知识,你可以通过添加来计算与z轴的角度。
from math import acos, sqrt
cos_theta=1./sqrt(a*a+b*b+1)
theta=acos(cos_theta)
theta将是垂直于平面的矢量与以弧度表示的z轴之间的角度。例如,XY平面的θ为θ,ZY平面的θ为p / 2