본문 바로가기
파이썬으로 배우는 지구과학

파이썬을 이용하여 크기가 같은 곳 선으로 잇기(countour line 그리기)

by 0대갈장군0 2022. 9. 22.
반응형

등고선, 등압선 등등의 말을 들어 보셨을 것입니다.

 

등고선은 각 지점별로 고도가 같은 곳을 선으로 연결한 것으로, 지도 제작에 많이 이용합니다.

등압선은 일기도에서 각 지점별로 기압이 같은 곳을 선으로 연결한 것입니다.

 

우리말은 등압선, 등고선, 등밀도선 등으로 선의 이름이 다 다르게 되어 있는데, 영어식으로는 그냥 contour line이라고 해도 어느정도 다 말이 통하는거 같습니다.

 

천문학에서도 이런 contour line을 사용합니다. 픽셀별 빛의 세기(intensity)를 나타내거나 flux를 나타내니 아마도 등세기선 쯤으로 해석을 해야할 것 같은데, 편의상 그냥 contour line이라고 하겠습니다.

위 그림은 IC434를 확대한 것인데, 확대해서 보니 픽셀 하나하나가 보입니다. 그리고 그림 상단에 있는 표는 그림의 노란색 네모안의 픽셀을 기준으로하여 가로X세로 13X13 범위에 해당하는 픽셀 하나하나에 들어온 빛의 세기입니다. 그러니까

대략 저 노란색 범위에 있는 각 픽셀별 빛의 세기입니다.

 테이블에서 빨간색으로 표시된 중앙값이 522.283이고 그 바로 아래에 513.169가 있습니다. 왼쪽 노란색 네모박스안의 값입니다. 그럼 522.283과 513.169 사이에는 수 많은 빛의 세기의 연속값이 있을 것이고, 그 사이 어딘가에 519도 있을 겁니다. 마찬가지 값이 그 바로 오른쪽 노란색 네모 박스를 보면 522.067이 있고, 그 바로 아래에 509.346이 있는데 그 사이 어딘가에 519가 있을 겁니다. 이런식으로 두 픽셀사이의 값을 바탕으로 값을 내삽하면 519를 모조리 찾을 수 있고, 그렇게 값이 519인 모든곳을 선으로 이을 수 있습니다. 그럼 값이 519인 애들만 선으로 이으면 아마도 아래 그림처럼 될 것입니다.

반응형

물론 이걸 사람이 하면, 예를들어 519를 기준으로 값이 10 커지거나 작은 값을 모두 선으로 이어라 이러면, 509, 519, 529 등을 모두 찾아 선으로 이어야 하는데, 이게 사람이 할 짓은 아닙니다. 아마 말도 안되게 엄청난 중노동이 될 거라 확신합니다.

 

하지만 파이썬을 이용하면 삽시간에 끝납니다. 코드도 간단합니다. 단 2~3줄이면 끝납니다. 지난 포스팅에 이어 전체 코드는 다음과 같습니다.

import matplotlib.pyplot as plt
from astropy.wcs import WCS
from astropy.io import fits
from astropy.utils.data import get_pkg_data_filename
import numpy as np

filename = get_pkg_data_filename('C:\\111\\IC434.fits')
hdu = fits.open(filename)[1]
wcs = WCS(hdu.header)
fig = plt.figure(figsize=(18, 12))

plt.subplot(projection=wcs)
plt.grid(color='white', linestyle='--')
bar=plt.imshow(hdu.data, origin='lower', cmap=plt.cm.gist_heat, vmin=0, vmax=1000)
plt.colorbar(bar, label='Herschel 250'r'$\mu$m (MJy/sr)')
plt.xlabel('RA')
plt.ylabel('Dec')
plt.title('IC 434 dust continuum map(250'r'$\mu$m)', size=15)
### countour line 감격 설정
levelinter=np.linspace(0,850,3)
### contour line 그리기
plt.contour(hdu.data, linewidths=2, colors='white', linestyles="--", levels=levelinter)
plt.savefig('C:\\Users\\kalch\\Desktop\\IC434250.png',bbox_inches='tight', pad_inches=0.1, dpi=300)
plt.show()

여기서 contour line을 그리기 위한 코드 2줄을 추가하였습니다.

levelinter=np.linspace(0,850,3)
plt.contour(hdu.data, linewidths=2, colors='white', linestyles="--", levels=levelinter)

levelinter라는 변수를 만들고 np.linspace(0,850,3)이라고 했습니다. 이건 0부터 850까지 숫자를 같은 간격으로 3개 토해내라는 겁니다. 그럼 아마도 0, 425, 850 이렇게 3개 숫자가 나올 겁니다.

 

그 다음이 contour line을 그리는 명령어입니다.

plt.contour라고 치고

1. hdu.data -> 맨 위에 hdu에 있는 데이터를 가지고 그리겠다는 소리입니다. 바로 픽셀별 빛의 세기가 되겠죠?

2. linewidths -> 선의 두께지정

3. colors -> 선의 색깔지정

4. linestyles -> 선의 종류 지정

5. levels -> 선을 그릴 간격 지정, 위에 0,425, 850 이 여기에 해당합니다.

 

이렇게 코드를 추가하고 그림을 그리면

위 그림처럼 흰색 contour line이 추가된 것을 보실 수 있습니다.

이렇게 하여 파이썬을 이용해 contour line을 그리는 방법을 보았습니다.

 

contourline을 그리거나 color map을 그리는건 꼭 이것 뿐 아니라 엄청 다양한 영역에 활용할 수 있습니다. 다른 분야에 활용하여 그래프를 그리는건 또 차차 해볼 것입니다. 데이터만 있다면 얼마든지 해 볼 수 있겠다만, 데이터를 찾는게 쉽지 않네요..ㅠㅠ 

 

 

반응형

댓글