특정 윤곽선 안쪽에 영역을 가져 오는 방법을 찾으려고합니다. matplotlib.pyplot
을 사용하여 윤곽을 만듭니다.
누구나이 경험이 있습니까?Matplotlib을 사용하여 파이썬에서 윤곽선 내의 면적을 어떻게 계산합니까?
고마워요.
특정 윤곽선 안쪽에 영역을 가져 오는 방법을 찾으려고합니다. matplotlib.pyplot
을 사용하여 윤곽을 만듭니다.
누구나이 경험이 있습니까?Matplotlib을 사용하여 파이썬에서 윤곽선 내의 면적을 어떻게 계산합니까?
고마워요.
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
그린의 정리를 잘 사용하십시오! –
면적 계산하기 @의 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)
참고를하는 경우 때문에 등고선을 따르는 점이 반대 방향으로 향하게되면 결과는 음수가됩니다.
예를 들자면 등고선에서 점을 얻을 수 있다면 면적을 다각형 영역으로 계산할 수 있다고 생각합니다. – HYRY