2011-04-14 200 views
41

我想從均勻間隔的2D數據(類似圖像的數據)的單個輪廓中獲取數據。matplotlib - 從輪廓線中提取數據

基於類似的問題找到了例子:How can I get the (x,y) values of the line that is ploted by a contour plot (matplotlib)?

>>> import matplotlib.pyplot as plt 
>>> x = [1,2,3,4] 
>>> y = [1,2,3,4] 
>>> m = [[15,14,13,12],[14,12,10,8],[13,10,7,4],[12,8,4,0]] 
>>> cs = plt.contour(x,y,m, [9.5]) 
>>> cs.collections[0].get_paths() 

此調用爲cs.collections[0].get_paths()的結果是:

[Path([[ 4.   1.625  ] 
[ 3.25  2.  ] 
[ 3.   2.16666667] 
[ 2.16666667 3.  ] 
[ 2.   3.25  ] 
[ 1.625  4.  ]], None)] 

基於該地塊,這一結果是有道理的,似乎是輪廓線的(y,x)對的集合。

除了手動循環此返回值,提取座標併爲該行組裝數組外,是否有更好的方法從matplotlib.path對象獲取數據?從matplotlib.path提取數據時是否有缺陷要注意?

或者,在matplotlib或更好的numpy/scipy中有沒有其他替代方法可以做類似的事情?理想的情況是獲得描述線條的(x,y)對的高分辨率向量,這可以用於進一步分析,因爲一般來說,我的數據集不像上面的例子那麼小或簡單。

+2

你有一個規範的問題! +1 – heltonbiker 2011-11-24 00:24:31

回答

38

對於給定的路徑,你可以得到點是這樣的:

p = cs.collections[0].get_paths()[0] 
v = p.vertices 
x = v[:,0] 
y = v[:,1] 
9

來自:http://matplotlib.org/api/path_api.html#module-matplotlib.path

路徑對象的用戶不應直接訪問頂點和代碼陣列 。相反,他們應該使用iter_segments()來獲取頂點/代碼對 。這很重要,因爲許多Path對象(作爲 優化)根本不存儲代碼,但iter_segments()爲它們提供了默認的一個 。

否則,我不確定你的問題是什麼。使用座標時,[Zip]是一個有時可用的內置函數。 1

3

我面臨類似的問題,並且偶然發現了this matplotlib list discussion

基本上,可以去掉繪圖並直接調用底層函數,不是非常方便,但可能。該解決方案也不是像素精確的,因爲底層代碼中可能會出現一些插值。

import matplotlib.pyplot as plt 
import matplotlib._cntr as cntr 
import scipy as sp 

data = sp.zeros((6,6)) 
data[2:4,2:4] = 1 

plt.imshow(data,interpolation='none') 
level=0.5 
X,Y = sp.meshgrid(sp.arange(data.shape[0]),sp.arange(data.shape[1])) 
c = cntr.Cntr(X, Y, data.T) 
nlist = c.trace(level, level, 0) 
segs = nlist[:len(nlist)//2] 
for seg in segs: 
    plt.plot(seg[:,0],seg[:,1],color='white') 

plt.show()