2011-07-01 157 views
8

我有一組數據,我想用它來在極座標中使用Matplotlib生成等高線圖。Matplotlib中的極座標等高線圖

我的數據如下:

  • theta - 角度的一維數組值
  • radius - 半徑的一維數組值
  • value - ,我想用於輪廓值的一維數組

這些都是正確對齊的所有1D陣列 - 例如:

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

也就是說,所有的值重複足夠多的次數,以便三個變量的這個'表'的每一行定義一個點。

如何從這些值創建極座標等值線圖?我曾考慮將半徑和θ值轉換爲x和y值,並以笛卡爾座標進行處理,但輪廓函數似乎需要二維數組,我不明白爲什麼。

任何想法?

回答

8

Matplotlib的contour()函數需要將數據排列爲每個網格點的2D網格點和相應的網格值。如果您的數據自然排列在網格中,則可以將r,theta轉換爲x,y並使用contour(r*np.cos(theta), r*np.sin(theta), values)來繪製您的圖。

如果您的數據不是自然網格化的,則應遵循Stephen的建議並使用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函數將1D數組轉換爲2D。