2017-06-28 36 views
1

私はベクトルフィールドをプロットしようとしており、Mayavi2sのquiver3d()関数を使用しています。私は、矢印が単位球面上での角度に応じて着色したいと思います:Mayaviのquiver3d()のカラーマップ

enter image description here

私はこれをこの方法で行うことができます。

def color(theta, phi): 
    while(phi < 0): 
     phi += 2.0*np.pi 
    h = phi/(2.0 * np.pi) 
    s = 1 
    v = 1.0 - 0.9999999*(theta/np.pi) 
    print("h = {}, s = {}, v ={}".format(h,s,v)) 
    return hsv_to_rgb(h,s,v) 

def plot_nice(): 
    x = np.array([1.,2.,3.]) 
    y = np.array([0.,0.,0.]) 
    z = y 

    phi = np.linspace(0,np.pi/2.0,3) 
    theta = phi 

    u = np.sin(theta) * np.cos(phi) 
    v = np.sin(theta) * np.sin(phi) 
    w = np.cos(theta) 

    obj = quiver3d(x, y, z, u, v, w, 
      line_width=3, colormap='hsv', 
      scale_factor=0.8, mode='arrow',resolution=25) 

    for i in range(x.shape[0]): 
     r,g,b = color(theta[i], phi[i]) 
     print("R: {}, G: {}, B: {}".format(r,g,b)) 
     obj = quiver3d(x[i], y[i], z[i], u[i], v[i], w[i], 
       line_width=3, color=(r,g,b), colormap='hsv', 
       scale_factor=0.8, mode='arrow',resolution=25) 
    return obj 

figure(bgcolor=(1,1,1)) 
plot_nice() 

しかし、私は数百を持っている場合、これは非常に遅いです矢印の私は、より高速な方法でそれを行うことができます。

def plot_fast(): 
    x = np.array([1.,2.,3.]) 
    y = np.array([0.,0.,0.]) 
    z = y 

    phi = np.linspace(0,np.pi/2.0,3) 
    theta = phi 

    u = np.sin(theta) * np.cos(phi) 
    v = np.sin(theta) * np.sin(phi) 
    w = np.cos(theta) 

    obj = quiver3d(x, y, z, u, v, w, 
      line_width=3, colormap='hsv', 
      scale_factor=0.8, mode='arrow',resolution=25) 
plot_fast() 

しかし、私はカラーマップ失う: enter image description here

どのように私は、各矢印のために新しいプロットを作成することなく、上のプロットのようなものを作成するのですか?

答えて

0

事実の後にプロットオブジェクトを操作することは可能です。

quiver3dコールには、引数scalars=np.mod(phi, 2*np.pi)(たとえば)とscale_mode='none'を追加します。 コールの後、メモリからライン

obj.glyph.color_mode = 'color_by_scalar' 

を追加し、それは別に矢印の色や大きさを制御することが可能かもしれないが、これはもう少し手の込んだです。

+0

戦争が正しく理解されていれば、1次元情報しかエンコードできないのですか?私は極角と方位角の両方をエンコードしたいと思います。例えば。 https://en.wikipedia.org/wiki/HSL_and_HSV – Stein

+0

カスタムの長さまたはカスタム色のいずれかを指定できます。どのような方法でも、色はphiとthetaに依存します。 'scalars'引数はx、y、z、u、v、wと同じ長さでなければなりません。 –

関連する問題