2012-01-25 25 views
25

私はpythonとmatplotlibに単純な問題があります。 私は3つのリストを持っています:x [y]、y [i]における密度をrho [i]とするx、y、rho。 xとyの値はすべて-1です。 1.特定の順序ではありません。Python:3つのリストからの2次元等高線プロット:x、y、rho?

密度ρ(点x、yで補間された)の等高線プロット(imshowと同様)の作成方法。

ありがとうございました。

編集:私は、大きな配列を扱う:X、Yおよびrhoが10,000〜1,000,000の要素

+0

あなたが受け入れられたコードは、あなたのために働いたのですか?同じ種類のリストシナリオを持っていますが、それを解決することはできません。 – diffracteD

答えて

39

の間であなたのrho値を補間する必要があります。これを行う方法はありません。また、「最良の」方法は、補間に組み込む必要がある事前情報に完全に依存します。

しかし、「ブラックボックス」補間法では、ラジアル基底関数(たとえば、「薄板スプライン」が特定のタイプのラジアル基底関数です)に入ることがよくあります。あなたはポイント数百万を持っている場合は、この実装は非効率的になりますが、出発点として:

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

# Generate data: 
x, y, z = 10 * np.random.random((3,10)) 

# Set up a regular grid of interpolation points 
xi, yi = np.linspace(x.min(), x.max(), 100), np.linspace(y.min(), y.max(), 100) 
xi, yi = np.meshgrid(xi, yi) 

# Interpolate 
rbf = scipy.interpolate.Rbf(x, y, z, function='linear') 
zi = rbf(xi, yi) 

plt.imshow(zi, vmin=z.min(), vmax=z.max(), origin='lower', 
      extent=[x.min(), x.max(), y.min(), y.max()]) 
plt.scatter(x, y, c=z) 
plt.colorbar() 
plt.show() 

enter image description here

+0

非常に興味深い方法ですが、大きな配列では機能しません:x、y、rhoには約10000個の要素があります。 – Vincent

+0

大きな配列にRbfを使用することはできます。私は少しだけ例を追加します。また、通常のグリッド上のすべてを実際にサンプリングしたくない場合は、delaunay三角測量を使用して等高線を描くことができます(これは単なる非常に簡単で、特に滑らかな補間方法ではありません)。しかし、多くの点で、ローカル補間法を使うほうが現実的です。 –

+0

@JoeKingtonこんにちは、上記のコードに問題があります。私のデータセットはx、y、zのリストで構成されています。 xとyは独立して変化し、zは(x、y)に依存して変化する。 'x =(1.2〜2.5)'、 'y =(90〜180)'、 'z =(5〜-5)'です。上記のコードを自分のデータセットで試してみると、折りたたみプロット(x軸には何も表示されません)が表示されます。助けてください。 – diffracteD

11

あなたがscipyのダウンロードのgriddata(scipyのダウンロード> = 0.10が必要です)を使用することができ、それは、三角測量ベースの方法です。

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

# Generate data: for N=1e6, the triangulation hogs 1 GB of memory 
N = 1000000 
x, y = 10 * np.random.random((2, N)) 
rho = np.sin(3*x) + np.cos(7*y)**3 

# Set up a regular grid of interpolation points 
xi, yi = np.linspace(x.min(), x.max(), 300), np.linspace(y.min(), y.max(), 300) 
xi, yi = np.meshgrid(xi, yi) 

# Interpolate; there's also method='cubic' for 2-D data such as here 
zi = scipy.interpolate.griddata((x, y), rho, (xi, yi), method='linear') 

plt.imshow(zi, vmin=rho.min(), vmax=rho.max(), origin='lower', 
      extent=[x.min(), x.max(), y.min(), y.max()]) 
plt.colorbar() 
plt.show() 

逆距離もありますが、補間秤量 - RBFに類似しますが、ポイントの大#のためのより良い動作するはず:Inverse Distance Weighted (IDW) Interpolation with Python