2017-07-06 8 views
1

海洋循環モデル(MITgcm)の出力データがあります。理想化されたチャンネル(デカルト)なので、奇妙なことではありません。疎なデータを使ってPythonで2次元等高線プロットをプロットする

y-z平面にいくつかのフィールド(速度、温度など)をプロットしたいと思います。シミュレーション領域は、各層が800×400のy-xグリッドである30の垂直層を含む。私はフィールドのそれぞれをz、y、xに向かってシェイプ(30,800,400)でnumpy配列に格納しています。

x-y平面スライスを30垂直レベルで簡単にプロットすることができます。私はmatplotlibのcontourfまたはimshowを使ってこれを行うことができ、範囲をkm単位で正しい物理値に変更することができます。

問題は、縦のレイヤーが不均一に配置されていることです。私はZのグリッドデータを持っています。これは、各レイヤーがどの物理的な深さ(メートル単位)に対応しているかを示しています。

Zは、[ - 5。 -15。 -25。 -36。 -49。 -65。 -84。 -105.5 -130.5 -159.5 -192.5 -230。 -273。 -322.5 -379。 -443。 -515。 -596。 -688。 -792。 -909.5 -1042.5 -1192.5 -1362。 -1553.5 -1770。 -2015。 -2285。 -2565。 -2845]

2985(フルドメイン深度が2985m)の「垂直」レイヤーを持つ空のマトリックスを作成し、30レイヤーの対応する位置にyデータを入力することで、その後

yz_matrix = np.empty((2985, 800)) #empty matrix for yz-plane data, vertical extent is 2985 (m) 

for i in range(len(Z)): 
    yz_matrix[round(-Z[i])] = yz_zonal[i] #set matrix values to correct depths 

私が行うことによって、matplotlibのの関数imshowを使用してyz_matrixプロットしてみた場合:

fig = plt.figure() 
ax = fig.add_subplot(111) 
ax.set_xlabel('y (km)') 
ax.set_ylabel('z (m)') 
yzplot = ax.imshow(yz_matrix, aspect='auto', interpolation='gaussian', cmap='inferno', extent=[0,2000,-2985,0]) 
plt.colorbar(yzplot) 

は、私はこれを取得の上Zによって与えられる(ここではデータ値の(30800)行列yz_zonalです)図:BAD y-z plot of velocity data

正しい物理z位置に30個のデータ値のストリップがありますが、それらの間にはゼロの負荷があります。私は、30のストリップの間のデータを補間し、他のすべての点を無視したいだけです。

誰かが私のためにこれを整理することができれば華麗でしょう。前もって感謝します!

ピーター

答えて

1

あなたが直接座標としてのzとyのデータの関数meshgridを与え、pcolormeshとしてyz_matrixをプロットします。これは、zの次の値まで異なる大きさのセルにつながる。下の左の図を参照してください。

新しい細かいグリッドでデータを補間することもできます。この目的のために、scipy.interpolate.griddataを使用することができる。

enter image description here

import numpy as np 
import matplotlib.pyplot as plt 
from scipy.interpolate import griddata 

z = np.array([-5.,-15.,-25.,-36.,-49.,-65.,-84.,-105.5,-130.5,-159.5,-192.5, 
       -230.,-273.,-322.5,-379.,-443.,-515.,-596.,-688.,-792.,-909.5, 
       -1042.5,-1192.5,-1362.,-1553.5,-1770.,-2015.,-2285.,-2565.,-2845.]) 
y = np.arange(0,100) 
yz_matrix = np.cumsum(np.random.rand(len(z), len(y)), axis=0) 

fig, (ax, ax2) = plt.subplots(ncols=2) 

# plot raw data as pcolormesh 
Y,Z = np.meshgrid(y,z[::-1]) 
ax.pcolormesh(Y,Z, yz_matrix, cmap='inferno') 
ax.set_title("pcolormesh data") 

# now interpolate data to new grid 
zi = np.arange(-2845,-5) 
YI,ZI = np.meshgrid(y,zi) 
points = np.c_[Y.flatten(),Z.flatten()] 

interp = griddata(points, yz_matrix.flatten(), (YI,ZI), method='linear') 

ax2.pcolormesh(YI,ZI, interp, cmap='inferno') 
ax2.set_title("pcolormesh interpolated") 

plt.show() 
+0

ありがとうございます!それは本当に役に立ちます。私は今、素敵なプロットを作ってきました!以前はmeshgridやgriddataを使ったことはありませんでしたが、私が必要としているように聞こえます。 メッシュグリッドY、Z = np.meshgrid(y、z [:: - 1])を定義するときにzをz [::-1]としてスライスした理由を明確にすることはできますか?なぜ単にnp.meshgrid(y、z)だけではないのですか? –

+0

'z'を反転させる特別な理由は、低い値をより負のzにすること以外は特にありません。自分のデータがどのように整理され、何を入力するかを決定する必要があります。 – ImportanceOfBeingErnest

0

はmatplotlibのサイトからこのexampleを見て、特に機能np.meshgridplt.contourf。不規則なz年代でこのような何かが動作します:

z = [1,2,5,10] 
x = [1,2,3,4,5,6,7,8] 

zz, xx = np.meshgrid(z, x) 

# create some data 
values = np.random.randn(len(x), len(z)) 

plt.contourf(zz, xx, values) 
plt.show() 
関連する問題