2016-05-30 105 views
1

在試圖操縱matplotlib中的圖表時,我遇到了一些有趣的事情。當使用繪圖函數時,可以通過別名修改x和y座標,但是z不能。這很容易解釋嗎? 我已經包含了一個小例子,請注意,我試圖讓點沿着圓柱體螺旋運動。3D Matplotlib中的動態點操作

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

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

ax.set_xlabel("X") 
ax.set_ylabel("Y") 
ax.set_zlabel("Z") 

radius = 8 

# Cylinder 
x = np.linspace(-radius, radius, 100) 
z = np.linspace(0, 2, 100) 
X, Z = np.meshgrid(x, z) 

Y = np.sqrt(radius**2 - X**2) 

ax.plot_surface(X, Y, Z, alpha=0.3, linewidth=0) 
ax.plot_surface(X, (-Y), Z,alpha=0.3, linewidth=0) 

X = np.array(np.zeros(1)) 
Y = np.array(np.zeros(1)) 
Z = np.array(np.zeros(1)) 

X[0]= radius*np.cos(np.deg2rad(0)) 
Y[0]= radius*np.sin(np.deg2rad(0)) 
Z[0]= 0. 

ax.plot(X,Y,Z, 'or',markersize=3) 

for i in range(0,360,5): 

    X[0]= radius*np.cos(np.deg2rad(i)) 
    Y[0]= radius*np.sin(np.deg2rad(i)) 
    Z[0]= i/140. 

    plt.draw() 
    plt.pause(0.01) 

作爲參考,這項工作的最終目標是要能夠基於在實時傳感器輸入來點位置時,在三個維度。

謝謝任何​​有見識的人,爲什麼會出現這種情況並提供可行的解決方案!

回答

1

這的確是有趣的.. Line3DLine2D得來,所以像get_xdataset_xdata功能也沒有在z方向可用。展望源代碼(art3d.py),似乎z值被完全忽視:

def draw(self, renderer): 
    xs3d, ys3d, zs3d = self._verts3d 
    xs, ys, zs = proj3d.proj_transform(xs3d, ys3d, zs3d, renderer.M) 
    self.set_data(xs, ys) 
    lines.Line2D.draw(self, renderer) 

可是我也許不能正確理解如何Line3D的工作......

然而,有能夠使用的功能來操縱z值(set_3d_properties),但由於該函數調用get_xdataget_ydata本身,只有這樣我能得到這個工作是:

p = ax.plot(X,Y,Z, 'or', markersize=3)[0] 

for i in range(0,360,5): 
    p.set_xdata(radius*np.cos(np.deg2rad(i))) 
    p.set_ydata(radius*np.sin(np.deg2rad(i))) 
    p.set_3d_properties(zs=i/140.)