오늘도 NCL입니다
그동안은 한 프레임에 1가지 그림만 들어갔지만 이번에는 파이썬에서 ax[2,2]처럼
여러 가지 그림을 한 번에 그려보겠습니다
추가로 반복문을 이용해서 0 ~ 23까지 시간별로 있는 그림들을 한 번에 그려보는 것도 해보겠습니다
오늘 코드입니다
fi = addfile("/home/lee/MERRA2_400.tavg1_2d_rad_Nx.20220331.nc4", "r")
time = fi->time
lat = fi->lat
lon = fi->lon
ts = fi->TS
;wks open
plt = new(4, graphic)
wks = gsn_open_wks("png", "surface_tem")
hour = (/"0H", "1H", "2H", "3H"/)
;resorece
res = True
res@gsnRightString = "Temperature unis : K"
res@mpCenterLonF = 180
res@gsnFrame = False
res@gsnDraw = False
res@cnFillOn = True
res@cnLinesOn = False
res@cnMinLevelValF = 210
res@cnMaxLevelValF = 310
res@cnLevelSpacingF = 10
res@cnFillPalette = "WhiteBlueGreenYellowRed"
;Repeated sentence
do k = 0, 3
res@gsnLeftString = "Surface Skin Temperature ("+hour(k)+")"
plt(k) = gsn_csm_contour_map(wks, ts(k, :, :), res)
end do
;set panel
pnlres = True
row = 2
col = 2
gsn_panel(wks, plt, (/row, col/), pnlres)
NCL 하면서 처음으로 이렇게 길게 작성해본 것 같아요
하나하나 보겠습니다
1. File Read
fi = addfile("/home/lee/MERRA2_400.tavg1_2d_rad_Nx.20220331.nc4", "r")
time = fi->time
lat = fi->lat
lon = fi->lon
ts = fi->TS
이 부분은 저번 포스팅에서 있었죠??
파일을 읽어오고 변수들을 지정해준 부분입니다
2. Workspace Setting
;wks open
plt = new(4, graphic)
wks = gsn_open_wks("png", "surface_tem")
hour = (/"0H", "1H", "2H", "3H"/)
다음은 work station 설정입니다
한 창에 여러가지 그림을 그리려면 panel 이라는 코드를 사용해야합니다
이 부분은 파이썬하고 굉장히 비슷합니다
파이썬은 figure라는 전체 그림 안에 axes라는 작은 그림들이 들어가는 형태입니다
NCL도 마찬가지 입니다
plt라는 전체 그림 안에 뒤에서 나올 gsn_panel라는 작은 그림들이 들어가는 형태입니다
plt = new(4, graphic) 은 "새로 전체 그림을 만들거고 안에 들어갈 그림은 4개이며 형태는 그래픽 형태로 들어간다"
라고 지정을 해준 겁니다
그림 갯수는 전체 그림 갯수를 말하는 겁니다
그림을 2*2로 넣을지1*4로 넣을지는 뒷 부분에서 정합니다
wks는 workstation 설정이기 때문에 넘어가고
hour는 나중에 그림별로 스트링에 몇시의 자료인지 출력해주기 위해서 새로 만들었습니다
3. Resource Setting
;resorece
res = True
res@gsnRightString = "Temperature unis : K"
res@mpCenterLonF = 180
res@gsnFrame = False
res@gsnDraw = False
res@cnFillOn = True
res@cnLinesOn = False
res@cnMinLevelValF = 210
res@cnMaxLevelValF = 310
res@cnLevelSpacingF = 10
res@cnFillPalette = "WhiteBlueGreenYellowRed"
다음은 resource 설정입니다
gsnRightString으로 단위를 작성해주었고 mpCenterLonF로 지도 중심 경도를 설정했습니다
res@gsnFrame = False
res@gsnDraw = False
이 부분은 panel 함수를 사용하기 위해서는 코드처럼 False로 해주는 것이 좋습니다
False로 하지 않으면 각각 그림들이 하나씩 그려진 후에 마지막에 4장이 합쳐진 plt가 그려지는 과정을 거치기 때문에
결과물이 총 5개가 나옵니다
res@cnFillOn = True
res@cnLinesOn = False
res@cnMinLevelValF = 210
res@cnMaxLevelValF = 310
res@cnLevelSpacingF = 10
res@cnFillPalette = "WhiteBlueGreenYellowRed"
이 부분은 저번 포스팅과 똑같습니다
contour plot인데 선 없이 색으로만 채워주었고 색의 범위와 눈금 범위, colormap까지 지정해주었습니다
4. Loop
;Repeated sentence
do k = 0, 3
res@gsnLeftString = "Surface Skin Temperature ("+hour(k)+")"
plt(k) = gsn_csm_contour_map(wks, ts(k, :, :), res)
end do
다음은 NCL에서는 처음 사용해보는 반복문 입니다
파이썬은 for i in ____: 형태를 사용하지만 NCL과 포트란에서는 do를 사용합니다
차이점이라고 하면 파이썬은 for의 숫자가 소수도 가능합니다
np.arange(0, 10, 0.5)처럼 소수도 가능하지만 포트란과 NCL은 정수밖에 사용이 안됩니다
만약 반복문에서 소수를 사용해야 한다면 do i = 0, 20 을 한 후에 다음줄에 k = i * 0.5처럼 새로 곱해서 만들어야합니다
그래서 do k = 0, 3으로 0, 1, 2, 3 3개의 숫자를 뽑았고
LeftString에서 마지막 부분에 "+hour(i)+"부분이 중요합니다
아까 위에서 0H, 1H, 2H, 3H를 만든 배열이 hour였는데 거기서 0번째 값, 첫번째 값 이렇게 가져오는 겁니다
그리고 나서 4번째 줄은 plt라는 큰 그림안에 넣을 0번째 그림, 첫 번째 그림 이런 식으로 지정을 해서
순서대로 contour_map을 그립니다
시간도 0 ~ 3까지 나와야 하기 때문에 ts에서 시간 부분에 {k}를 입력해서 이것도 순서대로
만들 수 있도록 만들었습니다
5. Set Panel
;set panel
pnlres = True
row = 2
col = 2
gsn_panel(wks, plt, (/row, col/), pnlres)
마지막 부분입니다
이제 plt에 그림 순서를 지정해주었으니까 배열만 해서 그림을 완성시키면 됩니다
저는 2x2 형태로 그림을 그렸습니다
panel 별로 리소스도 있지만 따로 하지는 않았습니다
gsn_panel(workstation, plt, array, resource) 형태로 자료에 맞게 구성해서 그려보겠습니다
결과
이렇게 제가 원해던 결과가 나왔습니다
새로운 코드들이 많다보니까 설명들이 많아져서 조금 길어진거 같습니다
다음 포스팅에서 시간별 그림을 한 번에 그려보도록 하겠습니다
긴 글 읽어주셔서 감사합니다!!
'NCL' 카테고리의 다른 글
작업8: WRF 모델 결과 NCL로 시각화하기1 (0) | 2023.06.21 |
---|---|
작업7: NCL로 netCDF 파일 시각화하기3 (0) | 2023.05.03 |
작업5: NCL로 netCDF 파일 시각화하기1 (4) | 2023.05.01 |
작업4: NCL로 막대그래프 그려보기3 (0) | 2023.01.06 |
작업3: NCL로 막대그래프 그려보기2 (0) | 2023.01.02 |