NCL

작업5: NCL로 netCDF 파일 시각화하기1

이석사 중 2023. 5. 1. 13:28
728x90

오늘은 오랜만에 NCL 포스팅 입니다

 

기상학에서 많이 사용하는 데이터 포맷인 netCDF 자료를 시각화 해보겠습니다


먼저 코드입니다

fi = addfile("/home/lee/MERRA2_400.tavg1_2d_rad_Nx.20220331.nc4", "r")

time = fi->time
ts = fi->TS({0},:,:)
lat = fi->lat
lon = fi->lon

wks = gsn_open_wks("png", "surface_tem")
res = True
res@gsnLeftString = "Surface Skin Temperature"
res@gsnRightString = "Temperature unis : K"
res@mpCenterLonF = 180

res@cnFillOn = True
res@cnLinesOn = False
res@cnMinLevelValF = 210
res@cnMaxLevelValF = 310
res@cnLevelSpacingF = 10
res@cnFillPalette = "WhiteBlueGreenYellowRed"

plot = gsn_csm_contour_map(wks, ts, res)

하나하나 살펴보겠습니다


1. File 읽기

fi = addfile("/home/lee/MERRA2_400.tavg1_2d_rad_Nx.20220331.nc4", "r")

time = fi->time
ts = fi->TS({0},:,:)
lat = fi->lat
lon = fi->lon

첫 번째 줄은 파일을 읽어오는 부분입니다

 

NCL을 리눅스 환경에서 사용하기 때문에 /home/lee 라는 경로가 붙고 파일 이름을 적어주시면 됩니다

 

제가 가져온 자료는 NASA에서 제공하는 자료입니다

 

https://disc.gsfc.nasa.gov/datasets?project=MERRA-2

 

GES DISC

 

disc.gsfc.nasa.gov

제가 가져온 자료는 여기서 받아보실 수 있습니다

 

보통 이런 자료들은 수정할 수 없게 읽기 전용으로 되어있는 파일들이 많습니다

 

그렇기 때문에 "r"이라는 것을 붙여줘서 읽기 전용이라는 것을 알려줬습니다

 

그 아래는 기본적인 변수들입니다

 

time과 lon, lat는 시간, 경도, 위도이기 때문에 크게 문제는 없고

 

Temperature Surface를 줄여놓은 TS를 봐야합니다

 

netCDF 자료는 메타데이터로 한 변수에 대해서 다양한 자료들이 함께 포함된 자료입니다

 

그렇기 때문에 저는 안에 어떤 변수들이 있는지 확인하기 위해서 python으로 한 번 열어보고 옵니다

 

pip install netCDF4

from netCDF4 import Dataset

path = '/content/drive/MyDrive/From_EARTHDATA/MERRA2_400.tavg1_2d_rad_Nx.20220331.nc4'

f = Dataset(path)

f.variables()

이 코드를 실행해서 보면 

 

굉장히 많은 자료들이 들어있습니다

 

여기서 우리가 보고 싶은 TS를 보면

자료의 단위, 차원, 가능한 최대값, 최소값 등 다양한 자료들이 있습니다

 

여기서 중요한 부분은 unlimited dimensions입니다

 

time이라고 되어 있는데 처음 netCDF 파일 이름을 보면 20220331로 일 자료입니다

 

하지만 안에 저장된 값은 1시간 별로 24가지가 들어있습니다

 

전지구 자료이기 때문에 위도 경도는 변경이 불가능하지만 시간은 0~23시 내의 어떤 시간대든

 

그려볼 수 있기 때문에 unlimited인 겁니다


추가로 아래 코드를 실행해보면 사진처럼 파일안에 어떤 변수들이 있는지 한 번에 볼 수도 있습니다


2. 파일 시각화

 

다시 돌아가서 이제 lon, lat, time, ts까지 변수 지정을 완료했습니다

 

이제 그림을 그리는 부분입니다

wks = gsn_open_wks("png", "surface_tem")
res = True
res@gsnLeftString = "Surface Skin Temperature"
res@gsnRightString = "Temperature unis : K"
res@mpCenterLonF = 180

res@cnFillOn = True
res@cnLinesOn = False
res@cnMinLevelValF = 210
res@cnMaxLevelValF = 310
res@cnLevelSpacingF = 10
res@cnFillPalette = "WhiteBlueGreenYellowRed"

plot = gsn_csm_contour_map(wks, ts, res)

첫 번째 줄을 그림을 저장할 방식을 지정했습니다

 

저는 png파일로 했고 이름은 surface_tem으로 했습니다

 

res@gsnLeftString = "Surface Skin Temperature"
res@gsnRightString = "Temperature unis : K"
res@mpCenterLonF = 180

이 부분은 그림의 왼쪽 위와 오른쪽 위에 써줄 글씨를 설정했습니다

 

왼쪽에는 자료가 무슨 자료인지를 써주었고 오른쪽에는 단위를 써줬습니다

 

mpCenterLonF는 지도 중심의 경도를 지정해주는 겁니다

 

res@cnFillOn = True
res@cnLinesOn = False
res@cnMinLevelValF = 210
res@cnMaxLevelValF = 310
res@cnLevelSpacingF = 10
res@cnFillPalette = "WhiteBlueGreenYellowRed"

그림을 contour plot으로 그릴거고 일반 contour가 아니라 속이 찬 contour를 사용할거기 때문에

 

cnFillOn을 True로 했고 색을 채우는 대신 등온도 선들이 보이지 않게 Lines는 False로 했습니다

 

다음은 색깔의 시작과 끝을 지정했습니다

 

이 그림을 그리기 전에 일반 contour를 그려본 결과 210 ~ 310이 자료의 범위였기 때문에 

 

MinLevel은 210으로 MaxLevel은 310으로 해줬습니다

 

색깔 간격은 칸당 10으로 지정했습니다

 

색깔 팔레트는 "WhiteBlueGreenYellowRed"로 지정해줬습니다


그리고 마지막으로 

plot = gsn_csm_contour_map(wks, ts, res)

이 코드를 작성하고 실행하면

 

이런 그림이 나오게 됩니다 하지만 color palette가 불연속적인 색깔이라서 끊어져서 보이는게 조금 아쉬웠습니다

 

palette는 제가 더 찾아보고 부드럽게 연결되는게 있는면 수정해서 추가해보겠습니다


오늘도 이렇게 NCL로 시각화를 해보았는데요

 

한동안은 해면기압 자료로 등압선들을 그리거나 바람 자료로 벡터장을 그려보는 것들을 할 것 같습니다

 

긴 글 읽어주셔서 감사합니다!!

728x90