2017-01-10 10 views
1

EDIT: зафиксированы пределы xyz для осей с последними 4 строками кода Теперь мне просто нужен ответ на отображение длины строки.Отображение длин линий в Matplotlib 3D Scatter

OK Это будет длинный вопрос. Я хотел бы (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() 

выглядит следующим образом: (красный текст добавлен позже и то, что я хотел бы изменения, чтобы выглядеть)

enter image description here

+0

Вы можете разместить код на рисунке в этом вопросе? – Lucas

+0

попытайтесь сделать [минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve) – Lucas

+0

Надеемся, что редактирование имеет смысл. – peer

ответ

1

Для того, чтобы отобразить длину линии, вам нужно сначала вычислить эту длину, вычислив (евклидово) расстояние между его конечными точками в трехмерном пространстве.
Затем вы можете поместить текстовую метку (см. definition here) на график, используя ax.text(x,y,z, text, ...), как показано, например, в 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

+0

Работал отлично! Благодарю. Последнее замечание: я, наконец, тоже получил координаты: 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]. Это x, y, z для четырех вершин тетраэдра в 3D плюс точка внутри пирамиды, равноудаленная от каждой из вершин. Кроме того, молекулярная структура метана (и других), вот почему я отправился в это путешествие. Спасибо за вашу помощь и @Ibellomo's – peer

+0

Не могли бы вы объяснить математику ... а именно - l = np.sqrt (np.diff (X) ** 2 + np.diff (Y) ** 2 + np.diff (Z) ** 2) ax.plot3D (X, Y, Z, 'b') – peer

+1

'l = np.sqrt (np.diff (X) ** 2 + np.diff (Y) ** 2+ np.diff (Z) ** 2) 'дает длину линии, см. [Евклидово расстояние] (https://en.wikipedia.org/wiki/Euclidean_distance). Если вы хотите, чтобы это было похоже на Pythagoras для 3D. – ImportanceOfBeingErnest

 Смежные вопросы

  • Нет связанных вопросов^_^