2014-03-27 1 views

답변

8

contour 함수가 반환하는 윤곽 컬렉션의 collections 속성에서 각 윤곽을 설명하는 경로를 얻을 수 있습니다. 'vertices'경로에는 형상의 정렬 된 정점이 포함됩니다.

정점을 사용하면 등고선 적분 0.5 * (x * dy-y * dx)를 근사 할 수 있습니다. 적용하면 Green's theorem은 닫힌 영역의 면적을 제공합니다.

그러나 윤곽선은 플롯에 완전히 포함되어야합니다. 그렇지 않으면 윤곽선이 연결된 경로가 아닌 여러 개의 경로로 나뉘어지며 메서드가 고장 나기 때문에 윤곽선은 이어야합니다.

다음은 r = 1.0, r = 2.0, r = 3.0에 대해 반경 함수, 즉 r = (x^2 + y^2)^0.5로 둘러싸인 영역을 계산하는 데 사용되는 방법입니다.

import numpy as np 
import matplotlib.pylab as plt 

# Use Green's theorem to compute the area 
# enclosed by the given contour. 
def area(vs): 
    a = 0 
    x0,y0 = vs[0] 
    for [x1,y1] in vs[1:]: 
     dx = x1-x0 
     dy = y1-y0 
     a += 0.5*(y0*dx - x0*dy) 
     x0 = x1 
     y0 = y1 
    return a 

# Generate some test data. 
delta = 0.01 
x = np.arange(-3.1, 3.1, delta) 
y = np.arange(-3.1, 3.1, delta) 
X, Y = np.meshgrid(x, y) 
r = np.sqrt(X**2 + Y**2) 

# Plot the data 
levels = [1.0,2.0,3.0] 
cs = plt.contour(X,Y,r,levels=levels) 
plt.clabel(cs, inline=1, fontsize=10) 

# Get one of the contours from the plot. 
for i in range(len(levels)): 
    contour = cs.collections[i] 
    vs = contour.get_paths()[0].vertices 
    # Compute area enclosed by vertices. 
    a = area(vs) 
    print "r = " + str(levels[i]) + ": a =" + str(a) 

plt.show() 

출력 :

r = 1.0: a = 2.83566351207 
r = 2.0: a = 11.9922190971 
r = 3.0: a = 27.3977413253 
+0

그린의 정리를 잘 사용하십시오! –

2

면적 계산하기 @의 spfrnd의 대답의 벡터화 버전 : 당신이 지역의 abs을해야 할 수도 있습니다

x=contour.vertices[:,0] 
y=contour.vertices[:,1] 
area=0.5*np.sum(y[:-1]*np.diff(x) - x[:-1]*np.diff(y)) 
area=np.abs(area) 

참고를하는 경우 때문에 등고선을 따르는 점이 반대 방향으로 향하게되면 결과는 음수가됩니다.