2016-01-29 16 views
6

this example のように3dで震えが使用されている場合は、すべての矢印の長さだけを設定することができます。 提供される矢印の実際の長さは反映されません。Python matplotlibで3d Quiverダイアグラムを正しくスケールする方法は?

2dの場合に機能する議論スケールは、ここでは機能しないようです。

矢印の長さが与えられたベクトルフィールドの長さを反映するように矢印を拡大縮小する方法はありますか?

答えて

2

を見てそれは奇妙だという。 u、v、wは方向を確定し、lengthパラメータはすべての長さに同じように作用するようです。配列をlengthパラメータに入れることはできません。周りの代表的な作品として

、あなただけ個別にそれぞれの矢印をプロットすることができます:答えのために、そして自分のよく文書化コードの

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

print(matplotlib.__version__) 

fig = plt.figure() 
ax = fig.gca(projection='3d') 

x, y, z = np.meshgrid(np.arange(-1, 1, 0.4), 
         np.arange(-1, 1, 0.4), 
         np.arange(-1, 1, 0.4)) 
x = x.reshape(np.product(x.shape)) 
y = y.reshape(np.product(y.shape)) 
z = z.reshape(np.product(z.shape)) 

scale = 0.02 
u = np.sin(np.pi * x) * np.cos(np.pi * y) * np.cos(np.pi * z) 
v = -np.cos(np.pi * x) * np.sin(np.pi * y) * np.cos(np.pi * z) 
w = np.sqrt(2.0/3.0) * np.cos(np.pi * x) * np.cos(np.pi * y) * np.sin(np.pi * z) 
lengths = np.sqrt(x**2+y**2+z**2) 

for x1,y1,z1,u1,v1,w1,l in zip(x,y,z,u,v,w,lengths): 
    ax.quiver(x1, y1, z1, u1, v1, w1, pivot = 'middle', length=l*0.5) 

ax.scatter(x,y,z, color = 'black') 
plt.show() 

3d Quiver

+0

それぞれの長さを個別に設定することは、まあ、それは動作するようだ... 答えをありがとう! – SeF

2

ドキュメントの周りをちょうど穿孔したhttp://matplotlib.org/mpl_toolkits/mplot3d/api.html これはあなたのために機能しますか?

まだ明らかでない矢印の長さは正しいですが、少なくとも今の3D

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

print(matplotlib.__version__) 

fig = plt.figure() 
ax = fig.gca(projection='3d') 

x, y, z = np.meshgrid(np.arange(-1, 1, 0.4), 
         np.arange(-1, 1, 0.4), 
         np.arange(-1, 1, 0.4)) 
scale = 0.02 
u = np.sin(np.pi * x) * np.cos(np.pi * y) * np.cos(np.pi * z) 
v = -np.cos(np.pi * x) * np.sin(np.pi * y) * np.cos(np.pi * z) 
w = np.sqrt(2.0/3.0) * np.cos(np.pi * x) * np.cos(np.pi * y) * np.sin(np.pi * z) 

ax.quiver(x, y, z, u, v, w, pivot = 'middle', arrow_length_ratio = 0.02) 
ax.scatter(x,y,z, color = 'black') 
plt.show() 

enter image description here

+0

感謝を! 矢印の方向は正しいが長さは変わらない。 u = 0.001 v = 0.001 w = 0.001 、次にu = 1 v = 1 w = 1 長さは常に同じです。 – SeF

+0

賞金についてDr Xorileは25ポイント、f5r5e5dは25ポイントだったはずです...私は分裂できませんでした! – SeF

+0

これは、現在のリリース候補とベータ版を持っているmatplotlib 2.0で修正されるはずです。ビルドには至っていませんが、インストールパッケージが見つかりません – f5r5e5d