Python 在Matplotlib 3D散点中显示线的长度

Python 在Matplotlib 3D散点中显示线的长度,python,matplotlib,annotations,geometry,label,Python,Matplotlib,Annotations,Geometry,Label,编辑:修复了带有最后4行代码的轴的xyz限制 现在,我只需要显示行长度的答案 好的,这将是一个很长的问题。我想(1)显示从中心点到外围点的直线长度,(2)固定轴坐标,以包含x轴从0-6、y轴0-6和z轴0-6的框 这是到目前为止的代码。我最终得到了正确的几何体,但由于默认的调整包含框,它看起来乱七八糟 from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt import numpy as np import

编辑:修复了带有最后4行代码的轴的xyz限制 现在,我只需要显示行长度的答案

好的,这将是一个很长的问题。我想(1)显示从中心点到外围点的直线长度,(2)固定轴坐标,以包含x轴从0-6、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()
如下所示:(之后添加了红色文本,这就是我希望更改的样子)


为了显示线的长度,首先需要通过计算三维空间中其端点之间的(欧几里德)距离来计算该长度。
然后,您可以使用
ax.text(x,y,z,text,…)
将文本标签(请参阅)放置到绘图中,如中所示


你能在问题中发布图形的代码吗?试着做一个简单的编辑,希望编辑有意义。改变你做数组的方式。只需使用:
np.array(x,dtype=np.float)
。为什么在3.5 z轴上有一个红色的6?y轴的方向相反。你确定问题不在于潜在客户吗?很好!谢谢最后一点,我最终也得到了正确的坐标:x=[1,5,3,3,3]y=[1,1,1+(2*m.sqrt(3)),1+(2/3)*m.sqrt(3),1+(2/3)*m.sqrt(3)]z=[0,0,0,4*m.sqrt(6)/12,(4*m.sqrt(6))/3]。即三维四面体的4个顶点的x、y、z加上棱锥体内的一个点,与每个顶点等距。还有甲烷(和其他物质)的分子结构,这就是我开始这段旅程的原因。谢谢你的帮助,@Ibellomo'请你解释一下数学。。。即-l=np.sqrt(np.diff(X)**2+np.diff(Y)**2+np.diff(Z)**2)ax.plot3D(X,Y,Z,'b')
l=np.sqrt(np.diff(X)**2+np.diff(Y)**2+np diff(Z)**2)
给出了线的长度,请参见。如果你想的话,就像毕达哥拉斯的3D版。
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()