2016-12-12 17 views
2

ファイ範囲=ヒートマップ半球プロット

これは私が持っているデータセットの例である:

Theta Phi Values 
-180 0 0.2 
-180 0.5 0.5 
... ... ... 
-180 -90 1.1 
-179.5 0 0.92 
... ... ... 
0  -90 0.6 
... ... ... 
180 -89.5 0.17 
180 -90 0.12 

だから結局、私はこの1つのような同様のプロットを取得したい:

Heat map plot[1] 私はコードで半球体を作成する方法を知っています下の私のデータフレームからどのように値を割り当てることができますか?

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

# Create a sphere 
r = 2 
pi = np.pi 
cos = np.cos 
sin = np.sin 
altitude 
phi, theta = np.mgrid[0.0:0.5*pi:180j, 0.0:2.0*pi:720j] # phi = alti, theta = azi 
x = r*sin(phi)*cos(theta) 
y = r*sin(phi)*sin(theta) 
z = r*cos(phi)  
#Set colours and render 
fig = plt.figure(figsize=(10, 8)) 
ax = fig.add_subplot(111, projection='3d') 
ax.plot_surface(
    x, y, z, rstride=4, cstride=4, color='w', alpha=0.1, linewidth=0)  
ax.set_xlim([-2.2,2.2]) 
ax.set_ylim([-2.2,2.2]) 
ax.set_zlim([0,3]) 
ax.set_aspect("equal") 
ax.plot_wireframe(x, y, z, color="k") 

コードはこの

enter image description here

答えて

2

Axes3D.plot_surfaceは、入力として2次元アレイを受け付ける生成します。入力配列と同じ形状の配列を受け付けるfacecolors引数を提供します。この配列は、各面の色がrgbaタプルでなければなりません。したがって、配列の値を1までの範囲に正規化し、matplotlib.cmのカラーマップを指定することができます。

残りの問題は、提供されている3列の一覧からこの配列を取得することです。第1の列がxの値を示し、第2のyの値および第3の値を示す長さn*mのデータテーブルが与えられ、ソートが最初にxであり、次にyである場合。最後の列は(n,m)配列に整形できます。nxの値で、mの値は.reshape((m,n)).Tです。

一部さらに備考:以下の溶液で

  1. 、私はこの配列を模倣するために必要と直接放射、代わりの角度で角度を用います。
  2. ポイント数180 * 720は少し高いようです。ウィンドウが回転するのを避けるために、私はその数を減らしました。
  3. 通常の教科書の定義であるphi = azimuthal angle、theta =傾斜角(z軸から)と一致するように、角度を変更しました。
  4. plot_wireframeの使用はあまり意味を持たないかもしれません。それは下のサーフェスを隠すためです。ワイヤーフレームが必要な場合は、描画するポイント数とキーワード引数のlinewidthで再生できます。 linewidthを3または5のように大きな値に設定すると、サーフェスが見やすくなり、1に設定するとワイヤフレームの外観が残ります。

これは完全な解決策です。

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

#theta inclination angle 
#phi azimuthal angle 
n_theta = 50 # number of values for theta 
n_phi = 200 # number of values for phi 
r = 2  #radius of sphere 

theta, phi = np.mgrid[0.0:0.5*np.pi:n_theta*1j, 0.0:2.0*np.pi:n_phi*1j] 

x = r*np.sin(theta)*np.cos(phi) 
y = r*np.sin(theta)*np.sin(phi) 
z = r*np.cos(theta) 

# mimic the input array 
# array columns phi, theta, value 
# first n_theta entries: phi=0, second n_theta entries: phi=0.0315.. 
inp = [] 
for j in phi[0,:]: 
    for i in theta[:,0]: 
     val = 0.7+np.cos(j)*np.sin(i+np.pi/4.)# put something useful here 
     inp.append([j, i, val]) 
inp = np.array(inp) 
print inp.shape 
print inp[49:60, :] 

#reshape the input array to the shape of the x,y,z arrays. 
c = inp[:,2].reshape((n_phi,n_theta)).T 
print z.shape 
print c.shape 


#Set colours and render 
fig = plt.figure(figsize=(10, 8)) 
ax = fig.add_subplot(111, projection='3d') 
#use facecolors argument, provide array of same shape as z 
# cm.<cmapname>() allows to get rgba color from array. 
# array must be normalized between 0 and 1 
ax.plot_surface(
    x,y,z, rstride=1, cstride=1, facecolors=cm.hot(c/c.max()), alpha=0.9, linewidth=1) 
ax.set_xlim([-2.2,2.2]) 
ax.set_ylim([-2.2,2.2]) 
ax.set_zlim([0,4.4]) 
ax.set_aspect("equal") 
#ax.plot_wireframe(x, y, z, color="k") #not needed?! 
plt.savefig(__file__+".png") 
plt.show() 

enter image description here

+0

うわー!これは完全に私が探しているものです。私は自分の価値を正規化し、それをfacecolorsの議論に入れようと考えていましたが、私の価値を再構成するのは混乱していました。多くのありがとう@ImportanceOfBeingErnest! –

+0

@ImportanceOfBeingErnest素敵な答えですが、私は上記のようなタイプのプロットに興味があります。あなたは、コードの「形を変える」部分で何をやっているのか詳しく教えてください。この部分は "入力配列をx、y、z配列の形に書き換えます c = inp [:、2] .extape((n_phi、n_theta))T print z.shape print c.shape " –

+1

" c "はx、y、zと同じ形状の配列でなければなりません。したがって、z [yi、xi]の点の色は 'c [yi、xi]'である必要があります。これを取得する方法は、あなたが持っているデータに依存します。ここでの再形成は簡単なオプションです。 – ImportanceOfBeingErnest

関連する問題