显示Matplotlib 3D散点图中的线条长度

时间:2017-01-10 21:10:23

标签: python matplotlib annotations geometry label

编辑:修改最后4行代码的轴的xyz限制 现在,我只需要显示行长的答案。

好的这将是一个很长的问题。我想(1)显示从中心点到外围点的线的长度,以及(2)将轴坐标固定为具有0-6的y轴,y轴0-6和z-的包含框。轴0-6。

到目前为止,这是代码。我终于得到了几何图形,但由于默认调整后的包含框,它看起来都搞砸了。

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
import math as m

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')


x = [1, 5, 3, 3]
y = [1, 1, 1+(2* m.sqrt(3)), 1 +(2/3)*m.sqrt(3)]
z = [0, 0, 0, 4* m.sqrt(2)/m.sqrt(3)]

a = []
b = []
c = []
for item in x:
    a.append(float(item))
for item in y:
    b.append(float(item))
for item in z:
    c.append(float(item))

r = np.array(a)
s = np.array(b)
t = np.array(c)

ax.set_xlabel("x axis")
ax.set_ylabel("y axis")
ax.set_zlabel("z axis")


ax.scatter(r,s,zs = t, s=200)

for x, y, z in zip(r, s, t):
    ax.plot3D([x, 3], [y, 1+(2*(3**(1/2))/3)], [z, 4*(2**(1/2))/(3*(3**(1/2)))], 'b')

ax.set_ylim([0,6]). ##EDITED FIX TO AXES LABEL PROBLEM
ax.set_xlim([6,0])
ax.set_zlim([0,6])

plt.show()

看起来像这样:(之后添加了红色文字,我希望这些更改看起来像)

enter image description here

1 个答案:

答案 0 :(得分:1)

为了显示线的长度,您需要首先计算3D空间中其终点之间的(欧几里德)距离。 然后,您可以使用ax.text(x,y,z, text, ...)将文字标签(请参阅definition here)添加到地块中,如图所示在matplotlib demo page

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import numpy as np
import math as m

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

r = np.array([1., 5., 3., 3.])
s = np.array([1., 1., 1.+(2* m.sqrt(3)), 1. +(2./3.)*m.sqrt(3)])
t = np.array([0., 0., 0., 4.* m.sqrt(2)/m.sqrt(3)])

ax.set_xlabel("x axis")
ax.set_ylabel("y axis")
ax.set_zlabel("z axis")

tx = "The line is {:.2f} units long."

ax.scatter(r,s,zs = t, s=200)

for x, y, z in zip(r, s, t):
    X = np.array([x, 3.])
    Y = np.array( [y, 1.+(2.*(3**(1/2.))/3.)])
    Z = np.array([z, 4.*(2**(1/2.))/(3.*(3.**(1/2.)))])
    # calculate length of line
    l = np.sqrt( np.diff(X)**2+np.diff(Y)**2+np.diff(Z)**2)
    ax.plot3D(X, Y, Z, 'b')
    # label the lines with the anchor at each line's center
    ax.text(X.mean(), Y.mean(), Z.mean(), tx.format(l[0]), size=10,color="r")

ax.set_ylim([0,6])
ax.set_xlim([6,0])
ax.set_zlim([0,6])

plt.show()

enter image description here