2016-03-24 30 views
0

次のスクリプトを使用して、一部の(x、y、z)データに対してLinearNDInterpolatorを使用しています。しかし、補間されたデータから、ヒートマップ形式の補間/プロットを表示する方法を理解することはできませんか? xとyの最小値と最大値に基づいてmeshgridを設定するようなものがないのですか?どんな助けや例も素晴らしいでしょう!LinearNDInterpolator(Python)を使用して補間値をプロットする

import numpy as np 
import scipy.interpolate 

x = np.array([-4386795.73911443, -1239996.25110694, -3974316.43669208, 
       1560260.49911342, 4977361.53694849, -1996458.01768192, 
       5888021.46423068, 2969439.36068243, 562498.56468588, 
       4940040.00457585]) 

y = np.array([ -572081.11495993, -5663387.07621326, 3841976.34982795, 
       3761230.61316845, -942281.80271223, 5414546.28275767, 
       1320445.40098735, -4234503.89305636, 4621185.12249923, 
       1172328.8107458 ]) 

z = np.array([ 4579159.6898615 , 2649940.2481702 , 3171358.81564312, 
       4892740.54647532, 3862475.79651847, 2707177.605241 , 
       2059175.83411223, 3720138.47529587, 4345385.04025412, 
       3847493.83999694]) 

# Create coordinate pairs 
cartcoord = zip(x, y) 

# Interpolate 
interp = scipy.interpolate.LinearNDInterpolator(cartcoord, z) 

編集:スピノールのソリューション、そして使ってPython 2.7は、次のコードは、私が(アプローチ1)を探しているものを私に与えます@に基づいて 。内挿点の密度を上げる方法はありますか?

データセットは、次のプロットが得られる: enter image description here

言うまでもないが(緯度、経度)座標がequirectrangular投影マップから取られているので、私は、結果が円形であることを期待していなかった、と言うこと。さらに調査すると、これは単にdifferent projectionにマップされていると思います。

答えて

3

私はあなたがzの値を補間しようとしていると仮定します。

ここで、コール補間機能を実行するとどうなりますか?これは、入力(xとy)と出力(z)の全体のランドスケープを作成します。上記のコードでは、実際にその値を求めていませんでした。この関数を使用するには、入力を指定する必要があり、補間された出力が得られます。

入力データを三角形分割し、線形重心補間を実行する各三角形で構成されるscipy.interpolate.LinearNDInterpolator関数を使用しました。あなたの入力に応じて、これが崩壊し、あなたがナンを得る地域が存在する可能性があります。たとえば、あなたのコードでこれを試してください

print interp(-4386790, 3720137) 

これはあなたのxとyのmin-maxの範囲内です。 fill_value引数を使用してNanを0に設定することができます。

ドキュメントを読んでください。しばしば、人々は次の機能も受け入れるかもしれない、scipy.interpolate.interp2d。代わりにスプライン補間を使用します。以下のコードでは、両方の関数(前者は0に設定された前者)を実装し、それらをヒートマップにプロットしました。

ヒートマップについては、あなたが疑ったとおりです。値のグリッドを作成する必要があります。以下は、LinearNDInterpolatorの出力グラフで、nanは0、interp2d、およびコードに設定されています。 LinearNDInterpolatorを使用

(cartcoord、Z、fill_value = 0) enter image description here

interp2d使用する(X、Y、Z) enter image description here

P.S.私はPython3を使用しています。 Python2で問題が発生した場合は、cartcoord = list(zip(x、y))からリストを削除してください。

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

x = np.array([-4386795.73911443, -1239996.25110694, -3974316.43669208, 
       1560260.49911342, 4977361.53694849, -1996458.01768192, 
       5888021.46423068, 2969439.36068243, 562498.56468588, 
       4940040.00457585]) 

y = np.array([ -572081.11495993, -5663387.07621326, 3841976.34982795, 
       3761230.61316845, -942281.80271223, 5414546.28275767, 
       1320445.40098735, -4234503.89305636, 4621185.12249923, 
       1172328.8107458 ]) 

z = np.array([ 4579159.6898615 , 2649940.2481702 , 3171358.81564312, 
       4892740.54647532, 3862475.79651847, 2707177.605241 , 
       2059175.83411223, 3720138.47529587, 4345385.04025412, 
       3847493.83999694]) 

# Create coordinate pairs 
cartcoord = list(zip(x, y)) 


X = np.linspace(min(x), max(x)) 
Y = np.linspace(min(y), max(y)) 
X, Y = np.meshgrid(X, Y) 

# Approach 1 
interp = scipy.interpolate.LinearNDInterpolator(cartcoord, z, fill_value=0) 
Z0 = interp(X, Y) 
plt.figure() 
plt.pcolormesh(X, Y, Z0) 
plt.colorbar() # Color Bar 
plt.show() 

# Approach 2 
func = scipy.interpolate.interp2d(x, y, z) 
Z = func(X[0, :], Y[:, 0]) 
plt.figure() 
plt.pcolormesh(X, Y, Z) 
plt.colorbar() # Color Bar 
plt.show() 
+0

サンプルコードと完全なソリューション!ありがとうございました!私は同じトピックの拡張であるため、私の質問を編集して、現在の結果を@ Spinorのソリューションに基づいて含めるようにしています。 – AaronJPung

+1

密度を上げるには、linspace関数をX = np.linspace(min(x)、max(x)、num = 100)に変更し、同様にYを行います。 – Spinor8

関連する問題