이제 그래프의 마지막이라고 할 수 있는 범주, legend를 그려보겠습니다
파이썬의 경우는 범주를 그릴때는 파이썬이 알아서 자료를 찾고 색깔도 찾아서 자동으로 그려주지만
NCL은 자료 갯수, 색깔, 이름까지도 전부 다 지정을 해줘야합니다 ㅠㅠ
그래서 파이썬은 plt.legend() 하나면 끝나지만 NCL은 조금 깁니다
코드를 보면 이렇습니다
x = (/1, 2, 3, 4, 5/)
y = (/2, 4, 6, 8, 10/)
w = gsn_open_wks("png", "blog")
res = True
res@gsnXYBarChart = True
res@gsnYRefLine = 0
res@gsnXYBarChartBarWidth = 0.5
res@gsnXYBarChartColors = (/"red", "orange", "yellow", "green", "blue"/)
res@trXMinF = 0
res@trXMaxF = 6
res@trYMaxF = 11
res@tiMainString = "Basic Bar Graph"
res@tiXAxisString = "x - value"
res@tiYAxisString = "y - value"
res@gsnFrame = False
p = gsn_csm_xy(w, x, y, res)
lbres = True
label = (/"a", "b", "c", "d", "e"/)
lbres@vpWidthF = 0.2
lbres@vpHeightF = 0.2
lbres@lbBoxMajorExtentF = 0.5
lbres@lbFillColors = res@gsnXYBarChartColors
lbres@lbMonoFillPattern = True
lbres@lbLabelFontHeightF = 0.02
lbres@lbPerimOn = False
gsn_labelbar_ndc(w, 5, label, 0.22, 0.8, lbres)
frame(w)
여기서 중요한 건 이 코드 전체가 그림을 그리는 부분 뒤에 들어가야합니다
이런 식으로 말이죠
기존 막대 그래프 그림 위에다가 범주만 따로 그린다고 생각하시면 편합니다
하나하나 살펴보겠습니다
lbres = True
먼저 범주에 사용될 리소스들을 따로 만들어야 합니다
label = (/"a", "b", "c", "d", "e"/)
그리고 각 막대들의 이름으로 쓰일 라벨을 만들어줍니다
lbres@vpWidthF = 0.2
lbres@vpHeightF = 0.2
범주가 들어갈 부분의 크기를 설정하는 겁니다
여기서 크기 숫자들은 NDC 단위를 사용합니다
여기서 NDC는 정규화된 좌표로 오른쪽 위를 왼쪽 모서리를 0,0 오른쪽 모서리를 1,1 로 하는 좌표계 입니다
0.2라는 숫자는 전체 길이 1중에서 0.2만큼의 길이를 쓰겠다 라는 말입니다
NCL은 모든 위치나 크기를 NDC로 사용하기 때문에 중요합니다
진짜 중요합니다!!
아래 그림 보시면 이해가 편하실 겁니다
lbres@lbBoxMajorExtentF = 0.5
이 부분은 범주에 그려지는 막대끼리 간격을 의미합니다
기본 값이 1도 돼있고 1은 서로 딱 붙어서 출력이 됩니다
숫자가 작아질 수록 사이 간격이 증가합니다
1일때는 요렇게
0.5로 설정했을 때는 요렇게 됩니다
lbres@lbFillColors = res@gsnXYBarChartColors
다음은 코드 그대로 색깔 지정입니다
lbres@lbMonoFillPattern = True
패턴이라는 코드는 조금 생소하죠?
NCL은 기본적으로 범례를 색깔만으로 나누지 않습니다
색깔만 지정해주면 아래 그림처럼 색깔을 가진 패턴으로 구분을 합니다
기본값은 False로 True로 바꾸지 않으면 저렇게 색을 가진 패턴이 나오게 됩니다
하지만 True로 바꿔주면?
같은 색깔 패턴으로 일치시킨다는 뜻이기 때문에 위에 처럼 단일색상 막대로 그림이 그려집니다
lbres@lbLabelFontHeightF = 0.02
이름 그대로 폰트의 크기를 정하는 부분입니다
길이니까? 역시 NDC 길이를 사용하겠죠??
따로 설정하지 않으면 기본값이 0.02이기 때문에 자동으로 됩니다
lbres@lbPerimOn = False
다음은 범례 크기에 맞게 테두리 선을 그릴지 말지를 정하는 부분입니다
기본값은 True 지만 저는 깔끔하게 그리기 위해 False로 설정했습니다
True로 하면 이런 모습입니다
gsn_labelbar_ndc(w, 5, label, 0.22, 0.8, lbres)
마지막입니다
진짜로 그림에 범례를 그려 넣는 부분입니다
사용법은 gsn_labelbar_ndc(워크스테이션, 막대상자 갯수, x위치, y위치, 지정한 리소스) 이렇습니다
워크스테이션은 작업이 진행될 부분
w = gsn_open_wks("png", "blog")
우리 코드에선 이 부분을 말합니다
막대 상자 갯수는 내가 그려넣은 막대 갯수 맞게 입력시켜주면 됩니다
x위치와 y위치는 제가 강조했던 NDC 좌표로 넣어주면 됩니다
바로 위치 감 잡는건 조금 힘드니 여러번 수정하시면서 적합하 위치를 찾으시면 됩니다
지정한 리소스는 위에서 범례에 쓰기위해 만들었던 리소스 lbres를 말합니다
frame(w)
마지막 frame은 아직 정확한 용도를 알지 못해서
나중에라도 정확하게 알게 되면 꼭 포스팅 해보겠습니다!
제가 추측한 용도는 워크스테이션을 여러개 사용할 경우 각각 그룹으로 묶기 위해 사용하는 거 같습니다
조금 더 공부해오겠습니다!
이렇게 모든 코드들을 작성하고 실행하면
이렇게 그림이 나옵니다!!
이제 좀 그림이 구색을 갖췄죠??
파이선 말고도 NCL로도 그림을 그려봤는데요
NCL 첫번째 포스팅에서 NCL은 대기과학을 위해 만들어진 언어라고 설명을 드렸었어요
다음 포스팅부터는 세계지도나 등고선, 등압선들을 그려보면서 왜 대기과학에 최적화되어 있는지 보겠습니다
긴 글 읽어주셔서 감사합니다!
'NCL' 카테고리의 다른 글
작업6: NCL로 netCDF 파일 시각화하기2 (0) | 2023.05.02 |
---|---|
작업5: NCL로 netCDF 파일 시각화하기1 (4) | 2023.05.01 |
작업3: NCL로 막대그래프 그려보기2 (0) | 2023.01.02 |
작업2: NCL로 막대그래프 그려보기1 (2) | 2023.01.01 |
작업 1: NCL로 플랭크 곡선 그려보기 (0) | 2022.11.01 |