2011-07-01 29 views
8

Matplotlibを使用して極座標で等高線プロットを作成するために使用するデータセットがあります。Matplotlibの極座標プロット

私のデータは以下の通りです:

  • theta - 角度の1次元配列が
  • radius値 - 半径の1次元配列が
  • value値 - 私は輪郭のために使用する値の1次元配列

これらはすべて正しく整列した1Dアレイです - 例:

theta radius value 
30  1  2.9 
30  2  5.3 
35  5  9.2 

つまり、3つの変数のこの 'テーブル'の各行が1つのポイントを定義するように、すべての値が十分に繰り返されます。

これらの値から極軌道プロットを作成するにはどうすればよいですか?私は、半径とシータ値をxとyの値に変換してデカルト座標で行うことを考えましたが、輪郭関数は2D配列を必要とするように思われます。

アイデア?

答えて

8

関数Matplotlibのcontour()関数は、データが点の2次元グリッドとそれらのグリッド点のそれぞれに対応する値のグリッドとして配列されることを期待しています。あなたのデータがグリッド内に自然に配置されている場合は、r、thetaをx、yに変換してcontour(r*np.cos(theta), r*np.sin(theta), values)を使用してプロットを作成できます。

データが自然にグリッド化されていない場合は、スティーブンスの助言に従って、griddata()を使用してデータをグリッドに補間する必要があります。

次のスクリプトは、両方の例を示しています。非常に明確な答えを

import pylab as plt 
from matplotlib.mlab import griddata 
import numpy as np 

# data on a grid 
r = np.linspace(0, 1, 100) 
t = np.linspace(0, 2*np.pi, 100) 
r, t = np.meshgrid(r, t) 
z = (t-np.pi)**2 + 10*(r-0.5)**2 

plt.subplot(121) 
plt.contour(r*np.cos(t), r*np.sin(t), z) 

# ungrid data, then re-grid it 
r = r.flatten() 
t = t.flatten() 
x = r*np.cos(t) 
y = r*np.sin(t) 
z = z.flatten() 
xgrid = np.linspace(x.min(), x.max(), 100) 
ygrid = np.linspace(y.min(), y.max(), 100) 
xgrid, ygrid = np.meshgrid(xgrid, ygrid) 
zgrid = griddata(x,y,z, xgrid, ygrid) 

plt.subplot(122) 
plt.contour(xgrid, ygrid, zgrid) 

plt.show() 

enter image description here

+0

感謝。私は軸についてのフォローアップの質問を投稿しました - http://stackoverflow.com/questions/6556361/add-polar-axes-to-cartesian-plot-in-matplotlib。あなたがそれを手伝うことができるかもしれないのだろうか? – robintw

3

極座標プロットを直接行うことは可能かどうかわかりませんが、直交座標に変換する場合は、griddata関数を使用して1次元配列を2Dに変換できます。

関連する問題