海洋循環モデル(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のストリップの間のデータを補間し、他のすべての点を無視したいだけです。
誰かが私のためにこれを整理することができれば華麗でしょう。前もって感謝します!
ピーター
ありがとうございます!それは本当に役に立ちます。私は今、素敵なプロットを作ってきました!以前はmeshgridやgriddataを使ったことはありませんでしたが、私が必要としているように聞こえます。 メッシュグリッドY、Z = np.meshgrid(y、z [:: - 1])を定義するときにzをz [::-1]としてスライスした理由を明確にすることはできますか?なぜ単にnp.meshgrid(y、z)だけではないのですか? –
'z'を反転させる特別な理由は、低い値をより負のzにすること以外は特にありません。自分のデータがどのように整理され、何を入力するかを決定する必要があります。 – ImportanceOfBeingErnest