2014-11-14 256 views
1

我正在使用下面的代碼生成三維曲面圖。我希望顏色代表半徑的值。如何繪製相應的顏色條?在Python中的顏色條中映射顏色

我相信問題在於我在製作曲面圖時使用了facecolors。所以我需要根據這個面部顏色製作色條。

據我所知,我必須將這些顏色映射到顏色條,這只是我不知道如何。

import numpy as np 
import matplotlib.pyplot as plt 

def sph2cart(theta, phi, radius): 
    x_cart = radius * np.sin(theta) * np.cos(phi) 
    y_cart = radius * np.sin(theta) * np.sin(phi) 
    z_cart = radius * np.cos(theta) 
    return np.array([x_cart, y_cart, z_cart]) 

def antenna_plot_3D(mod_F, T, P): 
    [x, y, z] = sph2cart(T, P, mod_F) 
    fig = plt.figure() 
    ax = fig.add_subplot(1, 1, 1, projection='3d') 
    p_surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, 
          linewidth=0, antialiased=True, 
          facecolors=cm.jet(np.sqrt(x*x + y*y + z*z))) 
    ax.set_zlabel('Z axis', fontsize=15) 
    ax.set_xlabel('X axis', fontsize=15) 
    ax.set_ylabel('Y axis', fontsize=15) 
    plt.savefig('3d_pattern.png') 
    plt.show() 

x = 300 
t = np.linspace(0, np.pi, num=x) 
p = np.linspace(0,2*np.pi, num=x) 
[T,P] = np.meshgrid(t,p) 
mod_F = np.sin(T) * np.cos(P) 
antenna_plot_3D(mod_F, T, P) 

我希望表面被着色,顏色應表示半徑。

+1

'fig.colorbar()' – 2014-11-14 17:52:40

+0

我已經試過了,它提供了以下錯誤。 raise RuntimeError('No mappable was found for use for colorbar' RuntimeError:沒有可映射被發現用於創建色條,首先定義一個可映射的圖像(帶有imshow)或輪廓集(帶有contourf) – Devansh 2014-11-14 17:58:06

+0

I '不會混淆所有這一切:閱讀此:http://stackoverflow.com/help/mcve – 2014-11-14 18:10:36

回答

1

下做任務

fig = plt.figure() 
ax = fig.add_subplot(1, 1, 1, projection='3d') 
p_surf=ax.plot_surface(x,y,z,rstride=1,cstride=1,linewidth=0,antialiased=True,facecolors=cm.jet(np.sqrt(x*x + y*y + z*z))) 
m = cm.ScalarMappable(cmap=cm.jet) 
m.set_array(x*x + y*y + z*z) 
plt.colorbar(m) 
plt.show() 
0

對不起,我不能在評論中添加此評論,因此張貼該論壇作爲回覆。 你應該根據#Ajean和@ PaulH添加到你的導入。然後,而不是面對顏色嘗試cmap。

from mpl_toolkits.mplot3d import axes3d, Axes3D 


def sph2cart(theta, phi, radius): 
    x_cart = radius * np.sin(theta) * np.cos(phi) 
    y_cart = radius * np.sin(theta) * np.sin(phi) 
    z_cart = radius * np.cos(theta) 
    return np.array([x_cart, y_cart, z_cart]) 


def antenna_plot_3D(mod_F, T, P): 
    [x, y, z] = sph2cart(T, P, mod_F) 
    fig = plt.figure() 
    ax = fig.add_subplot(1, 1, 1, projection='3d') 
    p_surf = ax.plot_surface(x, y, z, rstride=1, cstride=1, 
         linewidth=0, antialiased=True, 
         cmap=plt.cm.jet) 
    ax.set_zlabel('Z axis', fontsize=15) 
    ax.set_xlabel('X axis', fontsize=15) 
    ax.set_ylabel('Y axis', fontsize=15) 
    fig.colorbar(p_surf, shrink=0.5, aspect=5) 
    plt.savefig('3d_pattern.png') 
    plt.show() 

x = 300 
t = np.linspace(0, np.pi, num=x) 
p = np.linspace(0,2*np.pi, num=x) 
[T,P] = np.meshgrid(t,p) 
mod_F = np.sin(T) * np.cos(P) 
antenna_plot_3D(mod_F, T, P) 
plt.show() 

result plot

+0

我想根據半徑的值對曲面着色。 – Devansh 2014-11-16 12:22:38

+0

看到這個http://matplotlib.org/mpl_toolkits/mplot3d/tutorial.html#surface-plots – 2014-11-17 11:58:35

+0

要創建基於半徑的顏色,你必須創建一個索引爲x,y和一些函數的顏色數組來填充顏色該數組基於一個標準。問題是你將x,y和radius作爲單獨的數組傳遞,它們不會被索引。例如,如果我爲特定半徑選擇一種顏色,我應該可以將該特定顏色分配給相應的x,y。 – 2014-11-17 12:02:01