2011-04-14 2 views
41

균등 간격의 2D 데이터 (이미지와 유사한 데이터)의 단일 윤곽으로부터 데이터를 가져오고 싶습니다. How can I get the (x,y) values of the line that is ploted by a contour plot (matplotlib)?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

답변

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()가 제공하는 기본값 인 을 가지므로 중요합니다.

그렇지 않으면 귀하의 질문이 무엇인지 잘 모르겠습니다. [우편 번호]는 때로는 좌표로 작업 할 때 유용한 내장 함수입니다. 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()