NCL로 해보는 첫 번째 작업입니다
![](https://blog.kakaocdn.net/dn/FR39s/btrP98Uzjge/VqorjXXF6jkExMXtadfVT1/img.jpg)
아직은 공부하면서 익혀가는 단계이기 때문에 새로운 것들을 한다기 보다는
기존에 파이썬으로 그렸던 자료들을 한 번 씩 그려보려고 합니다
가장 먼저 해볼 것은 플랭크 곡선입니다
![](https://blog.kakaocdn.net/dn/biUzjg/btrP6gNm1jA/xieW6FFm0x8gPx0uQ4lKok/img.png)
이 그림입니다
파장별과 온도별로 흑체의 복사에너지를 구했던 그림입니다
NCL을 이용해서 한 번 그려보겠습니다
코드)
begin
t1 = 5777
t2 = 3000
t3 = 1000
t4 = 373
c1 = 3.7427 * 10^8
c2 = 1.4388 * 10^4
i = ispan(1, 2000, 1)
l = i * 0.01
eb1 = c1/(l^5 * (exp(c2/(l * t1) - 1)))
eb2 = c1/(l^5 * (exp(c2/(l * t2) - 1)))
eb3 = c1/(l^5 * (exp(c2/(l * t3) - 1)))
eb4 = c1/(l^5 * (exp(c2/(l * t4) - 1)))
eb1@_FillValue = 0.
eb2@_FillValue = 0.
eb3@_FillValue = 0.
eb4@_FillValue = 0.
wks = gsn_open_wks("png", "radiation")
;----- resource -----------------------------
res = True
res@tiXAxisString = "wavelength"
res@tiYAxisString = "black body radiation power"
res@xyLineThicknesses = (/5,5/)
res@trXMaxF = 20.
res@trYMinF = 10^0
res@xyYStyle = "log"
;res@gsnYRefLine = 1.
;-------------------------------------------
plot = gsn_csm_xy(wks, l, (/eb1, eb2, eb3, eb4/), res)
end
먼저 전체적인 코드입니다
NCL은 계산하는 코드와 그림을 그리는 코드가 한 번에 들어가기 때문에 전체적으로 코드가 길지 않습니다
하나 하나 알아보면서 설명드리겠습니다
1) 변수 선언
begin
t1 = 5777
t2 = 3000
t3 = 1000
t4 = 373
c1 = 3.7427 * 10^8
c2 = 1.4388 * 10^4
첫 번째 부분인 변수 선언입니다
NCL은 포트란처럼 탭을 한 번 치고 입력해야 한다거나 이런 것들은 없기 때문에
위에서부터 쭉 치면서 내려오시면 됩니다
여기서 또 포트란과 비슷한 점이라면 begin과 end로 열고 닫는 방식을 사용합니다
포트란은 begin은 안해도 되지만 NCL은 해줘야합니다
그 외에는 온도 와 복사 상수들을 선언하는 부분 입니다
2) 반복문을 이용한 계산
i = ispan(1, 2000, 1)
l = i * 0.01
eb1 = c1/(l^5 * (exp(c2/(l * t1) - 1)))
eb2 = c1/(l^5 * (exp(c2/(l * t2) - 1)))
eb3 = c1/(l^5 * (exp(c2/(l * t3) - 1)))
eb4 = c1/(l^5 * (exp(c2/(l * t4) - 1)))
eb1@_FillValue = 0.
eb2@_FillValue = 0.
eb3@_FillValue = 0.
eb4@_FillValue = 0.
두 번째 부분입니다
저번 포스팅에서 NCL에도 do i 처럼 반복문이 있다고 했었져??
하지만 ispan이라는 메소드를 더 자주 사용합니다
파이썬과 비슷한데 파이썬도 for i 라는 반복문이 존재하지만
numpy라는 라이브러리에 np.arange를 사용하면 범위 내에서 일정한 간격으로 숫자들을 반복문처럼
만들어 낼 수 있습니다
ispan도 arange와 똑같습니다
ispan( start, end, frequency )의 형식으로 사용합니다
그럼 제가 한 코드에서 ispan(1, 2000, 1)이면 1부터 2000까지 1씩 간격을 두고 숫자들을 만들겠다 라는 의미입니다
어렵지 않죠??
파장을 사용할 때는 0.1마이크로 미터 처럼 아주 작은 단위부터 시작하지만
ispan은 정수 범위만 읽을 수 있기 때문에 ispan(0.1, 20, 0.1) 이렇게가 안됩니다
그래서 i라는 변수에 1부터 2000까지 1씩 만들어주고
l이라는 변수에 i에 0.01을 곱해서 결과적으로 0.01 부터 20까지 나오게 만들었습니다
그 후 복사에너지 공식에 입력을 시켜줍니다
NCL에 좋은 점은 변수 하나 하나의 성격이나 특징 모두를 필요에 맞게 설정이 가능합니다
저희는 Y축을 Log 축으로 변환해 줄 겁니다
저번 포스팅에서 말씀 드린 것처럼 이 식의 계산 값은 0.083도 있고 2억이 넘어가는 값도 있기 때문에
값의 편차가 큰 값들은 log축으로 바꿔주는게 보는게 편하다고 했었습니다
하지만 log0의 값은 정의되지 않기 때문에 계산 결과가 0이 나오는 부분은 Missing Value라고 해서
값이 아예 없게 됩니다
하지만 출력은 해줘야 하기 때문에 0으로 빈 부분들을 채워서 그려보겠습니다
변수나 어떤 항목에 대해 설정해 줄때는 변수명@함수명 형태로 사용합니다
제 코드에서 보면 eb1@_FillValue = 0.을 해석해보면 eb1에 Missing 값들을 0으로 채워주겠다 라는 뜻 입니다
eb2, eb3, eb4도 똑같이 채워줍니다
3) 그래프 그리기
wks = gsn_open_wks("png", "radiation")
;----- resource -----------------------------
res = True
res@tiXAxisString = "wavelength"
res@tiYAxisString = "black body radiation power"
res@xyLineThicknesses = (/5,5/)
res@trXMaxF = 20.
res@trYMinF = 10^0
res@xyYStyle = "log"
;res@gsnYRefLine = 1.
;-------------------------------------------
plot = gsn_csm_xy(wks, l, (/eb1, eb2, eb3, eb4/), res)
end
이제 가장 중요한 resource를 정해주는 부분입니다
resource는 matplotlib에서 plt.xlabel, plt.title 처럼 그림의 속성들을 정해주는 겁니다
wks는 부분은 포트란으로 치면 open 문으로 파일 만드는 부분입니다
이름은 radiation이면서 파일 형식은 png 형태로 저장한다 라는 뜻입니다
resource는 줄여서 res라고 하고 위에 eb1@과 같은 방식으로 사용합니다
기본값은 False로 아무것도 설정하지 않게 되어 있기 때문에 res = True로 켜주어야
설정한 값들이 그림에 출력이 되게 됩니다
res를 다 설정해놓고 True로 바꿔주지 않으면 False인 상태로 출력하기 때문에 꼭 True로 해주어야 합니다
res@tiXAxisString = "wavelength"
res@tiYAxisString = "black body radiation power"
위에 2개는 x축과 y축에 label을 달아주는 부분 입니다
res@tiXAxisString 이 부분에서 ti는 title을 의미합니다
축이나 y축에 제목을 달아주는 것도 어떻게 보면 타이틀을 달아주는 거니까요
그래서 저 부분을 해석해보면 title을 달아줄건데 x축에다 할거고 string, 문자열 형태로 넣을거야 라는 뜻입니다
아래 y축도 똑같습니다
res@xyLineThicknesses = (/5,5/)
이 부분은 선의 두께를 지정해주는 부분입니다
xy는 line style이나 thicknesses처럼 그림의 모양에 관여해주는 것들이 들어있습니다
res@trXMaxF = 20.
res@trYMinF = 10^0
이 부분은 x축의 최대값과 y축의 최솟값을 지정해주는 부분입니다
기존 값과 다르기 때문에 바꿔준다는 의미의 tranform 줄여서 tr을 사용합니다
res@xyYStyle = "log"
그럼 이 부분은 어떤 뜻일까요??
Y축의 값의 style, 형태를 log축으로 사용하겠다라는 뜻입니다
그럼 이 부분도 바꿔주는거니까 tr을 써야하지 않나? 할 수 있지만
그림에 영향을 주는 부분이기 때문에 xy를 사용합니다
;res@gsnYRefLine = 1.
이 부분은 reference line을 추가하는 부분입니다
기준선을 추가하는 부분인데 처음 이 그림을 그렸을 때는 y축의 최솟값을 0으로 하지 않았기 때문에
보기 편하려고 추가했었지만 y축을 줄이면서 사용하지 않아도 되게 됬습니다
RefLine은 그림 안에 기준선을 그린다 보다는 다 그린 그림에 추가한다 라는 느낌이기 때문에
xy를 사용하지 않습니다
plot = gsn_csm_xy(wks, l, (/eb1, eb2, eb3, eb4/), res)
진짜로 그림을 그리는 부분 입니다
gsn_csm은 그림을 그리는 메소드의 계열입니다
gsn_csm_x면 x만 줘도 알아서 그리겠다는 뜻이고
위에 처럼 gsn_csm_xy면 xy 자료를 내가 모두 줄테니 그려라 라는 뜻입니다
뒤에 문법은 포트란과 비슷합니다
gsn_csm_xy( 그릴 파일, x값, y값, resource )의 형태로 이루어져 있습니다
이렇게 모든 것들을 설정해주고
end로 닫은 후에 실행을 해주면
![](https://blog.kakaocdn.net/dn/28d4F/btrQaaEPg1j/imX0ctTuNo9nGMreempSb0/img.png)
이런 그림이 나오게 됩니다
파이썬으로 그렸던 것과 똑같죠??
파이썬에서는 그래프끼리 구분을 해주지 않았을 때 색깔로 해주지만 NCL은 라인 스타일로 구분을 해준 모습입니다
NCL을 몇 번 해보면 정말 쉬운 언어라는 걸 알 수 있어여!!
정말 다른 언어를 배우셨던 분들은 쉽게 배우실 수 있고 안 배우셨었도 어렵지 않게 다가가실 수 있습니다!
다음 NCL 그림은 이심률을 그려보겠습니다
'NCL' 카테고리의 다른 글
작업5: NCL로 netCDF 파일 시각화하기1 (4) | 2023.05.01 |
---|---|
작업4: NCL로 막대그래프 그려보기3 (0) | 2023.01.06 |
작업3: NCL로 막대그래프 그려보기2 (0) | 2023.01.02 |
작업2: NCL로 막대그래프 그려보기1 (2) | 2023.01.01 |
NCL 기초 (0) | 2022.11.01 |