2016-05-30 7 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) 

、この運動の最終目標は、三次元で、リアルタイムでセンサ入力に基づいてポイントを配置できるようにすることです。

なぜこれが起こっているのか、解決策があるのか​​についての洞察を持っていただきありがとうございます。 get_xdataまたはset_xdataなどの機能もz方向では利用できませんので

答えて

1

これは確かに面白い..ですLine3Dは、Line2Dから派生しています。

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の仕事...

理解していない:ソースコード(art3d.py)を見ると、z値は完全に無視されるようです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.) 
関連する問題